泛型的偏函数应用

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 interruptedPlayground ..)

对于我正在尝试做的事情,是否有任何解决方法?

我没有测试过,但你可以试试:

@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,它应该有效。