使用泛型重载方法时出现意外行为:
func wrapper<T>() -> T? {
print(T.self)
let result: T? = internalFunc()
return result
}
func internalFunc<T>() -> T? {
print("generic")
return nil
}
func internalFunc() -> Int? {
print("non generic")
return nil
}
let s: Int = internalFunc() ?? 0
let s2: Int = wrapper() ?? 0
控制台输出:
非通用
内部
通用
我无法理解为什么调用的最后一个方法是通用的。不应该动态选择过载吗?如果是这样,我们可以看到T.self == Int.self
,并且应该调用非泛型方法。我哪里错了?
答案 0 :(得分:1)
在Swift中,"Overloaded functions are chosen at compile time"。
这意味着您对internalFunc()
内wrapper
的调用将始终调度到通用版本,因为编译器无法对其进行专门化。
关于空速的全文系列值得一读 - 这有助于澄清我对超载的理解。例如,本文的下一部分讨论了如何使用类而不是未绑定函数来获取运行时多态性。