【发布时间】:2016-05-03 05:51:27
【问题描述】:
我有这样的协议
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)
}
}
这里的一切对我来说都很好,现在在另一个类中我使用someType = MyType 实现 FooProtocol,然后当我尝试使用 T = MyType 初始化 Foo 类时,通过在 init 的 init 方法中传递 self Foo class 我得到一个编译错误,我在这里做错了什么?
错误信息:
" 无法使用
(_dep: NSObject -> () -> MyView)类型的参数列表调用 init"
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)`
}
someType == MyType 不符合 FooProtocol,因为我试图用T == MyType 初始化一个Foo 对象,这在技术上应该可行吗?
【问题讨论】:
-
你能具体说明你想用这种方法实现什么目标吗?为什么?
-
好的,我有一个具有执行异步任务的方法的类,我需要编写一个通用回调接口(协议),然后我可以在使用这些异步函数的类中实现它并将通用协议传递给这些函数作为参数,然后我可以在异步方法成功完成时进行回调
-
好的,我猜你不需要任何初始化方法。您可以在
viewController中将委托添加到协议中,并且能够通过该委托回调协议方法。喜欢:let delegate: FooProtocol?并且使用委托只需调用协议方法,例如:delegate?.dooFoo()
标签: ios swift swift2 swift-protocols