我有这样的协议
public protocol FooProtocol {
associatedType someType
func doFoo(fooObject:someType) -> Void
}
我有一个实现此协议的类
public class Foo<T> : FooProtocol {
private let _doFoo : (T) -> Void
init<P : FooProtocol where P.someType == T>(_dep : P) {
_doFoo = _dep.doFoo
}
public func doFoo(fooObject: T) {
_doFoo(fooObject)
}
}
到目前为止的一切对我来说都很好,现在在另一个类中,我用实现了FooProtocol someType = MyType
,然后当我尝试通过传入Foo
该类的init方法来初始化该类时T = MyType
,出现编译错误,这是我在做什么错?self
Foo
错误信息:
“无法使用类型为参数的列表调用init
(_dep: NSObject -> () -> MyView)
”
public class MyView : UIViewController, FooProtocol {
func doFoo(fooObject : MyType) {
...
}
// Here I want to initialize the Foo<T> class
let fooInstant : Foo<MyType> = Foo.init(_dep : self)
// I get the error message on the above line the error
// message reads "Cannot invoke init with an argument list
// of type `(_dep: NSObject -> () -> MyView)`
}
自身是否不符合FooProtocol的要求someType == MyType
,并且由于我试图以此来初始化Foo
对象,T == MyType
因此从技术上讲应该可以吗?
实际上,这似乎与您的泛型或协议一致性无关。只是您要self
在self
初始化之前尝试访问属性分配(在初始化过程中分配了默认属性值)。
因此,解决方案是使用如下所示的惰性属性:
lazy var fooInstant : Foo<MyType> = Foo(_dep : self)
现在,它将在首次访问时创建,因此需要self
进行初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句