带闭包的 Swift 泛型函数

标签 swift generics

我有以下通用函数(不属于任何类):

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/

相关文章:

ios - 更新使用数据库的应用程序

swift - 为什么我的 minimax 算法不撤消每一步?

swift - 仅在按下时才让 Sprite 移动?

generics - 实现不只是 impl Foo<T> 是否有技术原因?

Java协变/逆变与add/get

arrays - 尝试用 Argo 解码数组

java - 使用泛型和Varargs的ClassCastException

ios - SwiftUI 中的问题,Swift SignalR 客户端 WebSocket 关闭。代码 : 1000

ios - 为什么 UITableView 中的部分在不同设备上的顺序不同?

c# - 当 Collection 为 Null 时添加到 Collection