虽然可以定义一个闭包签名并将其用作泛型类型的具体类型,但是是否可以将泛型的可能类型限制为闭包 - 因此用户无法将其设置为比如说是一个字符串。如下所示:
class MyClass <T where T:Closure> {
init(closure:T) {
closure()
}
}
因此用户可以传递他们想要的任何闭包(接受任何参数,返回值,抛出状态等),但它必须是一个闭包。
答案 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"