泛型的偏函数应用
Partial function application with generics
我正在使用具有以下功能的 Observer
API (ObserverSet):
public func add<T: AnyObject>(object: T, _ f: T -> Parameters -> Void) -> ObserverSetEntry<Parameters>
它只是注册一个object
,然后在通知触发
时调用object
上的实例方法f
在我的一个经理中,我需要用我的一个隐藏以前的函数,这样我就可以强制观察者调用通过协议实现的预定义函数。
这是我到目前为止所做的:
@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
..)
对于我正在尝试做的事情,是否有任何解决方法?
我没有测试过,但你可以试试:
@objc protocol Observer : NSObjectProtocol {
func observe(param: String) -> Void
}
func addObserver<T: AnyObject where T: Observer>(observer: T) {
let f: T -> String -> Void = { ([=10=] as AnyObject).observe }
entries.addObserver(observer, f)
}
至少,这可以编译,因为 AnyObject
具有来自 ObjC 的所有方法 - 包括 @objc
- classes/protocols,如 ImplicitlyUnwrappedOptional
.
所以,编译:
let str = NSString(string: "test")
(str as AnyObject).observe("foo")
当然这会导致运行时错误,因为 NSString
没有 observe(_:)
方法。但是,在你的情况下,T
保证是 Observer
,它应该有效。
我正在使用具有以下功能的 Observer
API (ObserverSet):
public func add<T: AnyObject>(object: T, _ f: T -> Parameters -> Void) -> ObserverSetEntry<Parameters>
它只是注册一个object
,然后在通知触发
object
上的实例方法f
在我的一个经理中,我需要用我的一个隐藏以前的函数,这样我就可以强制观察者调用通过协议实现的预定义函数。
这是我到目前为止所做的:
@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
..)
对于我正在尝试做的事情,是否有任何解决方法?
我没有测试过,但你可以试试:
@objc protocol Observer : NSObjectProtocol {
func observe(param: String) -> Void
}
func addObserver<T: AnyObject where T: Observer>(observer: T) {
let f: T -> String -> Void = { ([=10=] as AnyObject).observe }
entries.addObserver(observer, f)
}
至少,这可以编译,因为 AnyObject
具有来自 ObjC 的所有方法 - 包括 @objc
- classes/protocols,如 ImplicitlyUnwrappedOptional
.
所以,编译:
let str = NSString(string: "test")
(str as AnyObject).observe("foo")
当然这会导致运行时错误,因为 NSString
没有 observe(_:)
方法。但是,在你的情况下,T
保证是 Observer
,它应该有效。