我有以下通用函数(不属于任何类):
func execFuncWithGenericParameter<T, U>(f: (T) -> U){
print(f("Hello World"))
}
我想用这样的闭包调用这个函数:
execFuncWithGenericParameter(f: { (p: String) -> Int in
print(p)
return 4711
})
但是编译器 (iPad Swift Playground) 告诉我“(String) -> U 不能转换为 (T) -> U”。
当然,我做了一些调查,认为编译器会自动推断类型。
谢谢。
最佳答案
根据 f: (T) -> U
的性质推断类型。问题是在您的第一个方法中对 f
的调用。
问问自己:如果 T 不是字符串会怎么样?那么 f("Hello world")
就是非法的。这就是您留给编译器的窘境 — 它正确地拒绝处理它。
这是一个合法的版本:
func execFuncWithGenericParameter<T,U>(f: ((T) -> U), param:T){
f(param)
}
execFuncWithGenericParameter(f: { (p: String) -> Int in
print(p)
return 4711
}, param:"Hello")
现在第一个方法知道 param
将是一个 T,所以一切都很好。而在第二个方法中,当我们调用第一个方法时,T是String,param
是一个String,所以它编译(并运行,并打印)。
关于带闭包的 Swift 泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43835422/