Swift文件Chapter 22 泛型
阿新 • • 發佈:2022-01-24
泛型函式可以用於任何的型別。
泛型函式
泛型函式使用T
作為佔位符,交換函式的泛型寫法是:
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
它不關心實際的型別,只是要求a
和b
的型別相同。
型別引數
我們使用T
作為佔位符,可以作為引數型別,函式的返回型別,還可以用作函式主體中的註釋型別。可提供多個型別引數,將它們都寫在尖括號中,用逗號分開。
命名型別引數
型別引數可以進行命名,例如字典Dictionary<Key, Value>
Key
和Value
。當沒有實際的意義的時候,可以使用T,U,V
等字母代替。一般使用大寫的駝峰命名法命名。
泛型型別
Swift還允許自定義泛型型別。這些自定義類、結構體和列舉可以適用於任意型別,就像Array
,Dictionary
。
泛型擴充套件
對於泛型擴充套件的時候,不需要提供引數列表的定義,可以直接進行使用。
型別約束
型別約束語法
在一個型別引數名後面放置一個類名或者協議名,並用冒號進行分隔,來定義型別約束。泛型型別也可以使用這種方法。
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // 這裡是泛型函式的函式體部分 }
關聯型別
定義一個協議時,可以宣告關聯型別作為協議的一部分。關聯型別為協議中的某個型別提供了一個佔位符名稱,其代表的實際型別在協議被遵循時才會被指定。使用associatedtype
關鍵字制定。
擴充套件現有型別來指定關聯型別
關聯型別協議也可以進行擴充套件。一旦型別實現了關聯型別協議,可以直接使用擴充套件指定協議。
給關聯型別新增約束
assoicatedtype
可以使用冒號後加入父類名或者協議名約束型別。
在關聯型別約束裡使用協議
協議可以作為它自身的要求出現。
where
語句
泛型關聯型別新增約束通過定義一個泛型where
子句來實現。
where
子句的擴充套件
具有泛型你也可以使用泛型where
where
子句的關聯型別
具有泛型你可以在關聯型別後面加上具有泛型where
的字句。
泛型下標
下標可以是泛型,它們能夠包含泛型where
子句。