我正在使用具有以下功能的Observer
API(ObserverSet):
public func add<T: AnyObject>(object: T, _ f: T -> Parameters -> Void) -> ObserverSetEntry<Parameters>
只需注册一个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)
}
不幸的是,我出现以下错误Partial application of generic method is not allowed
我在SO上找到了一个可能的解决方法,看起来像那样:
let f: T -> String -> Void = { (obs: T) in obs.dynamicType.observe(obs) }
但是这行代码使我的XCode在编译时带有一些Segmentation Fault: 11
,而Communication interrupted
带有Playground
会让我的XCode疯狂。)
我尝试做的是否有任何解决方法?
答案 0 :(得分:4)
我没有测试,但你可以试试:
@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)
}
至少,这是编译,因为AnyObject
包含来自ObjC的所有方法 - 包括@objc
- 类/协议,为ImplicitlyUnwrappedOptional
。
所以,编译:
let str = NSString(string: "test")
(str as AnyObject).observe("foo")
当然这会导致运行时错误,因为NSString
没有observe(_:)
方法。但是,在您的情况下,T
保证为Observer
,它应该有效。