return 类型问题导致的方法重载

Method overloading by return type issue

我在使用泛型重载方法时出现意外行为:

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

控制台输出:

non generic

Int

generic

我不明白为什么最后调用的方法是通用的。不应该动态选择过载吗?如果是这样,我们可以看到 T.self == Int.self,并且应该调用非泛型方法。我哪里错了?

在Swift,"Overloaded functions are chosen at compile time".

这意味着您在 wrapper 中对 internalFunc() 的调用将始终分派到通用版本,因为编译器无法专门化它。

关于 airspeedvelocity 的整个系列文章都值得一读——它有助于澄清我对超载的理解。例如,本文的下一部分将讨论使用 类 上的方法而不是未绑定的函数来获得运行时多态性。