2016-11-08 88 views
1

我有意想不到的行爲而使用泛型重載方法:方法重載

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和非泛型方法應該被調用。我錯在哪裏?

回答

1

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

這意味着您在wrapper中的internalFunc()的調用將始終調度爲通用版本,因爲編譯器無法對其進行專門化。

關於空速的整篇文章值得一讀 - 這有助於澄清我對超載的理解。例如,本文的下一部分將討論如何使用類上的方法獲取運行時多態,而不是未綁定的函數。