具有泛型的部分函数应用

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然后调用实例方法fobject通知时,触发器

在我的一位经理中,我需要隐藏前一个函数,因此我可以强制观察者调用通过协议实现的预定义函数.

这是我到目前为止所做的:

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

对于我正在尝试做的事情,有没有解决方法?

rin*_*aro 5

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

@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,它应该可以工作。