Swift入門教程19-泛型,swift入門教程19-
原創Blog,轉載請註明出處
blog.csdn.net/hello_hwc
一 泛型的定義
和C++的類似,泛型定義了一種適用於任何類型的,可重用的代碼,用一種抽象的方式來實現代碼。Swift的Array和Dictionary都是用泛型來實現的,因為Array可以儲存String類型的變數,也可以儲存Int類型的。
舉個例子
func swapTwoInts(inout a: Int, inout b: Int) { let temporaryA = a a=b b = temporaryA}func swapTwoStrings(inout a: String, inout b: String) { let temporaryA = a a=b b = temporaryA}func swapTwoDoubles(inout a: Double, inout b: Double) { let temporaryA = a a=b b = temporaryA}這是同樣的函數結構用來交換兩種類型,但是不用泛型的話,我們不得不為每一種類型都定義出對應的函數。十分繁瑣。
使用泛型之後,我們只需要這樣去定義
func swapTwoValues<T>(inout a: T, inout b: T) { let temporaryA = a a=b b = temporaryA}
這裡的T是佔為類型,就是告訴編譯器,這是個通用的類型,在實際運算的時候,會有具體的類型進行替換。佔為類型可以作為參數,也可以作為返回值。當然也可以定義多個,例如<T1,T2>
注意:Swift是型別安全的語言,編譯器會進行類型檢查,如果類型不符會報錯。
二 類型約束
在泛型定義中,類型約束十分重要。比如,定義一個泛型對一組資料進行排序,那麼這組資料一定要能夠比較(大於,等於,小於),如若不然,傳入一組資料中既有Int,又有String,Int和String進行排序,明顯沒有一個合理的規則。
泛型的約束表示這種類型必須繼承某個類,或者實現某些協議。
文法如下
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // function body goes here}
然後,實現一個使用類型約束來定義泛型的例子。
func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? { for (index, value) in enumerate(array) { if value == valueToFind { return index } } return nil}這裡,通過泛型來定義一個在數組中尋找指定資料的函數,明顯這個類型T要支援==運算子。Equatable就是系統提供的一種協議,遵循這種協議的類型都可以使用==運算子。
三 關聯類別型
在二中,我們使用了系統提供的Equatable,那麼如何自訂類似的協議呢?
使用關聯類別型,文法是在協議中使用typealise關鍵字來定義關聯類別型。
舉例
protocol Container {typealias ItemTypemutating func append(item: ItemType) var count: Int { get }subscript(i: Int) -> ItemType { get }}這裡,定義一種關聯類別型,ItemType,對於協議來說,任何遵循這個協議的結構體必須實現兩個方法(append,count)一個下標指令碼。而ItemType的具體類型由遵循協議的類來決定。例如
struct IntStack: Container {// IntStack
四 Where語句
Where語句對關聯類別型進行了更進一步的約束。一個where語句可以讓一個關聯類別型遵循某個特定的協議,也可以讓特定的資料類型和關聯類別型的資料類型一致。
func allItemsMatch< C1: Container, C2: Container where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, anotherContainer: C2) -> Bool { if someContainer.count != anotherContainer.count { return false } for i in 0..<someContainer.count { if someContainer[i] != anotherContainer[i] { return false } } return true}
這裡定義了四個約束
1.C1必須遵循Container協議
2.C2必須遵循Container協議
3.C1和C2的ItemType一致
4.C1的ItemType遵循Equatable協議