我试图想出一种方法来减少ViewController中使用Cleanse注入依赖的样板代码,然而,我的Cleanse.Component样板绝对停留在我的类型擦除类中。我做错了什么?
(为了便于阅读,包括代码和XCode快照)
import Foundation
import Cleanse
protocol CleanseInjectable {
func inject(args: Any...) -> Void
func prepare() -> Void
}
extension CleanseInjectable {
func inject(args: Any...) -> Void {
}
}
class AnyCleansePropertyInjectionComponent<TargetType: AnyObject, CleanseInjectable>: Cleanse.Component {
typealias Root = PropertyInjector<TargetType>
func configure<B : Binder>(binder binder: B) {
binder
.bindPropertyInjectionOf(TargetType.self)
.to(injector: (TargetType.self as! CleanseInjectable.Type).inject)
}
}我得到的错误和任何Swift协议一样离奇--只有在事后才能明显看到的错误:Type 'CleanseInjectable' has no member 'inject'?!

发布于 2016-06-25 13:38:59
这个版本似乎修复了这个错误!看起来斯威夫特无法理解TargetType: AnyObject, CleanseInjectable在约束方面等同于protocol CleanseInjectable: class。
import Cleanse
protocol CleanseInjectable: class {
func inject(args: Any...) -> Void
func prepare() -> Void
}
extension CleanseInjectable {
func inject(args: Any...) -> Void {
}
}
class AnyCleansePropertyInjectionComponent<TargetType: CleanseInjectable>: Cleanse.Component {
typealias Root = PropertyInjector<TargetType>
func configure<B : Binder>(binder binder: B) {
binder
.bindPropertyInjectionOf(TargetType.self)
.to(injector: TargetType.inject)
}
}编辑:我的已完成的Cleanse样板清除器(未在运行时测试,将尽快更新),有趣和灵感!
import Cleanse
protocol CleanseInjectable: class {
var cleanseComponent: AnyCleansePropertyInjectionComponent<Self>? { get }
func inject(args: Any...) -> Void
func prepare() -> Void
}
extension CleanseInjectable {
func inject(args: Any...) -> Void {
// Override me to do something useful, brah!
}
func prepare() -> Void {
if (cleanseComponent != nil) {
(try! cleanseComponent!.build()).injectProperties(into: self)
}
}
}
class AnyCleansePropertyInjectionComponent<TargetType: CleanseInjectable>: Cleanse.Component {
typealias Root = PropertyInjector<TargetType>
func configure<B : Binder>(binder binder: B) {
binder
.bindPropertyInjectionOf(TargetType.self)
.to(injector: TargetType.inject)
}
}https://stackoverflow.com/questions/38025158
复制相似问题