swift中泛型和 Any 類型

除了泛型,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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容