是否有可能将swift泛型类型约束为任何闭包

时间:2015-09-01 12:32:03

标签: swift generics swift2

虽然可以定义一个闭包签名并将其用作泛型类型的具体类型,但是是否可以将泛型的可能类型限制为闭包 - 因此用户无法将其设置为比如说是一个字符串。如下所示:

class MyClass <T where T:Closure> {
    init(closure:T) {
        closure()
    }
}

因此用户可以传递他们想要的任何闭包(接受任何参数,返回值,抛出状态等),但它必须是一个闭包。

1 个答案:

答案 0 :(得分:2)

您必须声明2个通用参数,一个用于参数类型,一个用于返回类型:

class MyClass <Arg, Result> {
    let closure: Arg -> Result

    init(closure: Arg -> Result) {
        self.closure = closure
    }

    func call(arg: Arg) -> Result {
        return self.closure(arg)
    }
}

let obj = MyClass { (a: Int, b: String) -> String in
    return "a: \(a), b: \(b)"
}

obj.call((42, "Hello"))  // -> "a: 42, b: Hello"