具有泛型的部分函数应用

时间:2015-02-05 20:36:27

标签: ios swift generics currying partial-application

我正在使用具有以下功能的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疯狂。)

我尝试做的是否有任何解决方法?

1 个答案:

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