如何将实例方法作为闭包参数传​​递给另一个函数?

时间:2016-03-10 00:02:50

标签: ios swift

我试图将一个对象方法作为参数传递给另一个期望关闭相同签名的函数。我看了this但没有成功。

// these are just dummy protocols to make my example run in Playground without include Alamofire or SwiftyJSON
public struct Response<Value, Error: ErrorType> { }
public protocol SwiftyJSONSerializable { }
public protocol ResponsePathProvider { }


class MyClass1 {
    func responseObject<T:SwiftyJSONSerializable>(keyPath path:String, completionHandler: Response<[String:T], NSError> -> Void) -> Self {
        return self
    }
}

class MyClass2 {
    func test() {
        let mc = MyClass1()
        mc.responseObject(keyPath: "/*/", completionHandler: testable) //fails
        mc.responseObject(keyPath: "/*/", completionHandler: self.dynamicType.testable(self)) //fails
    }

    func testable<T:SwiftyJSONSerializable>(response: Response<[String:T], NSError> -> Void) {
        //NOOP
    }
}

1 个答案:

答案 0 :(得分:1)

首先,可测试的功能应该是:

func testable<T:SwiftyJSONSerializable>(response: Response<[String:T], NSError>) {
    //NOOP
}

正确坚持类型。

不幸的是,我认为这是与协议相关的泛型的当前限制,或者是错误。如果您只是将SwiftyJSONSerializable更改为Class,则可以正常工作。