Swift泛型和泛型函數
泛型(generic)可以使我們在程序代碼中定義一些可變的部分,在運行的時候指定。使用泛型可以最大限度地重用代碼、保護類型的安全以及提高性能。在Swift集合類中,已經采用了泛型。
一、一個問題的思考
怎樣定義一個函數來判斷兩個參數是否相等呢?
如果參數是Int類型,則函數定義如下:
func isEqualsInt(a:Int, b:Int) -> Bool {
return (a == b)
}
這個函數參數列表是兩個Int類型,它隻能比較兩個Int類型參數是否相等。如果我們想比較兩個Double類型是否相等,可以修改上麵定義的函數如下:
func isEqualsDouble(a:Double, b:Double) -> Bool {
return (a == b)
}
這個函數參數列表是兩個Double類型,它隻能比較兩個Double類型參數是否相等。如果我們想比較兩個String類型是否相等,可以修改上麵定義的函數如下:
func isEqualsString(a:String, b:String) -> Bool {
return (a == b)
}
以上我們分別對3種不同的類型進行了比較,定義了類似的3個函數。那麼我們是否可以定義1個函數能夠比較3種不同的類型呢?如果isEqualsInt、isEqualsDouble和isEqualsString這3個函數名字後麵的Int、Double和String是可變的,那麼這些可變部分是與參數類型關聯的。
二、泛型函數
我們可以改造上麵的函數,修改內容如下:
func isEquals<T>(a: T, b: T) -> Bool { ①
return (a == b)
}
在函數名isEquals後麵添加<T>,參數的類型也被聲明為T,T稱為占位符,函數在每次調用時傳入實際類型才能決定T所代表的類型。如果有多個不同類型,可以使用其他大寫字母,一般情況下我們習慣於使用U字母,但是你也可以使用其他的字母。多個占位符用逗號“,”分隔,示例如下:
func isEquals<T, U>(a: T, b: U) -> Bool {...}
占位符不僅僅可以替代參數類型,還可以替代返回值類型。示例代碼如下:
func isEquals<T>(a: T, b: T) -> T {...}
事實上,上麵第①行的函數在編譯時會有錯誤發生,這是因為並不是所有的類型都具有“可比性”,它們必須遵守Comparable協議實現類型。Comparable協議表示可比較的,在Swift中,基本數據類型以及字符串都是遵守Comparable協議的。
修改代碼如下:
func isEquals<T: Comparable>(a: T, b: T) -> Bool { ② return (a == b) }
我們需要在T占位符後麵添加冒號和協議類型,這種表示方式被稱為泛型約束,它能夠替換T的類型。在本例中,T的類型必須遵守Comparable協議的具體類。
我們可以通過下列代碼測試第②行代碼定義的函數:
let n1 = 200 let n2 = 100 println(isEquals(n1, n2)) let s1 = "ABC1" let s2 = "ABC1" println(isEquals(s1, s2))
分別傳遞兩個Int參數和String參數進行比較,運行結果如下:
false
true
運行結果無需解釋了。泛型在很多計算機語言中都有采用,基本含義都是類似的,但是小的差別還是有的。
歡迎關注智捷iOS課堂微信公共平台

最後更新:2017-04-03 05:40:04