来自不同类的参考方法作为curried函数

时间:2015-06-22 12:51:33

标签: swift methods currying

merge中有两种RACSignal方法:

- (RACSignal *)merge:(RACSignal *)signal;
+ (RACSignal *)merge:(id<NSFastEnumeration>)signals;

当我写RACSignal.merge时,它引用静态方法:

class func merge(signals: NSFastEnumeration!) -> RACSignal!

如何引用对象方法?我无法写self.merge,因为它位于包装类中,self不是RACSignal

2 个答案:

答案 0 :(得分:3)

curried的类函数和curried实例函数有 不同的签名。与

类似

您可以通过明确指定签名来引用每个。

我没有使用RACSignal的经验,所以这里是人工的 希望可以在你的案例中应用的例子:

class MyClass {
    class func foo(s : String) {
        println("class foo: \(s)")
    }
    func foo(s : String) {
        println("instance foo: \(s)")
    }
}

// Reference to the class method:
let f1 : String -> Void = MyClass.foo

// Call the class method:
f1("bar")
// Output: class foo: bar

// Reference to the instance method:
let f2 : MyClass -> String -> Void = MyClass.foo

// Call the instance method:
let obj = MyClass()
f2(obj)("bar")
// Output: instance foo: bar

答案 1 :(得分:1)

由于Swift中的方法是curried类函数,编译器必须决定选择哪个重载。

要引用实例的merge方法,您需要指定它的确切类型:

let instanceMerge: RACSignal -> RACSignal! -> RACSignal! = RACSignal.merge