除了泛型,Swift 還支持 Any 類型,它能代表任何類型的值。從表面上看,這好像和泛型極其相似。Any 類型和泛型兩者都能用于定義接受兩個不同類型參數(shù)的函數(shù)。然而,理解兩者之間的區(qū)別至關(guān)重要:泛型可以用于定義靈活的函數(shù),類型檢查仍然由編譯器負(fù)責(zé);而 Any 類型則可以避開 Swift 的類型系統(tǒng) (所以應(yīng)該盡可能避免使用)。
讓我們考慮一個最簡單的例子,構(gòu)想一個函數(shù),除了返回它的參數(shù),其它什么也不做。如果使用泛型,我們可能寫為下面這樣:
func noOp<T>(x: T) -> T {
return x
}
而使用 Any 類型,則可能寫為這樣:
func noOpAny(x: Any) -> Any {
return x
}”
“noOp 和 noOpAny 兩者都將接受任意參數(shù)。關(guān)鍵的區(qū)別在于我們所知道的返回值。在 noOp 的定義中,我們可以清楚地看到返回值和輸入值完全一樣。而 noOpAny 的例子則不太一樣,返回值是任意類型 — 甚至可以是和原來的輸入值不同的類型。我們可以給出一個 noOpAny 的錯誤定義,如下所示:
func noOpAnyWrong(x: Any) -> Any {
return 0
}
使用 Any 類型可以避開 Swift 的類型系統(tǒng)。然而,嘗試將使用泛型定義的 noOp 函數(shù)返回值設(shè)為 0 將會導(dǎo)致類型錯誤。此外,任何調(diào)用 noOpAny 的函數(shù)都不知道返回值會被轉(zhuǎn)換為何種類型。而結(jié)果就是可能導(dǎo)致各種各樣的運(yùn)行時錯誤?!?/p>