Yam*_*man 6 generics currying partial-application ios swift
我正在使用具有以下功能的ObserverAPI(ObserverSet):
public func add<T: AnyObject>(object: T, _ f: T -> Parameters -> Void) -> ObserverSetEntry<Parameters>
Run Code Online (Sandbox Code Playgroud)
它只是注册一个object然后调用实例方法f的object通知时,触发器
在我的一位经理中,我需要隐藏前一个函数,因此我可以强制观察者调用通过协议实现的预定义函数.
这是我到目前为止所做的:
@objc protocol Observer : NSObjectProtocol {
func observe(param: String) -> Void
}
func addObserver<T: AnyObject where T: Observer>(observer: T) {
let f: T -> String -> Void = observer.dynamicType.observe
entries.addObserver(observer, f)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我出现以下错误 Partial application of generic method is not allowed
我在SO上找到了一个可能的解决方法,看起来像这样:
let f: T -> String -> Void = { (obs: T) in obs.dynamicType.observe(obs) }
Run Code Online (Sandbox Code Playgroud)
但是,这行代码会让我发疯的XCode与一些Segmentation Fault: 11在编译(并Communication interrupted用Playground..)
对于我正在尝试做的事情,有没有解决方法?
我还没有测试过,但你可以试试:
@objc protocol Observer : NSObjectProtocol {
func observe(param: String) -> Void
}
func addObserver<T: AnyObject where T: Observer>(observer: T) {
let f: T -> String -> Void = { ($0 as AnyObject).observe }
entries.addObserver(observer, f)
}
Run Code Online (Sandbox Code Playgroud)
至少,这可以编译,因为AnyObject具有来自 ObjC 的所有方法 - 包括@objc- 类/协议,如ImplicitlyUnwrappedOptional.
所以,这编译:
let str = NSString(string: "test")
(str as AnyObject).observe("foo")
Run Code Online (Sandbox Code Playgroud)
当然这会导致运行时错误,因为NSString没有observe(_:)方法。但是,在您的情况下,T保证是Observer,它应该可以工作。
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |