1. 程式人生 > 其它 >Swift文件Chapter 22 泛型

Swift文件Chapter 22 泛型

泛型函式可以用於任何的型別。

泛型函式

泛型函式使用T作為佔位符,交換函式的泛型寫法是:

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

它不關心實際的型別,只是要求ab的型別相同。

型別引數

我們使用T作為佔位符,可以作為引數型別,函式的返回型別,還可以用作函式主體中的註釋型別。可提供多個型別引數,將它們都寫在尖括號中,用逗號分開。

命名型別引數

型別引數可以進行命名,例如字典Dictionary<Key, Value>

中的KeyValue。當沒有實際的意義的時候,可以使用T,U,V等字母代替。一般使用大寫的駝峰命名法命名。

泛型型別

Swift還允許自定義泛型型別。這些自定義類、結構體和列舉可以適用於任意型別,就像ArrayDictionary

泛型擴充套件

對於泛型擴充套件的時候,不需要提供引數列表的定義,可以直接進行使用。

型別約束

型別約束語法

在一個型別引數名後面放置一個類名或者協議名,並用冒號進行分隔,來定義型別約束。泛型型別也可以使用這種方法。

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // 這裡是泛型函式的函式體部分
}

關聯型別

定義一個協議時,可以宣告關聯型別作為協議的一部分。關聯型別為協議中的某個型別提供了一個佔位符名稱,其代表的實際型別在協議被遵循時才會被指定。使用associatedtype關鍵字制定。

擴充套件現有型別來指定關聯型別

關聯型別協議也可以進行擴充套件。一旦型別實現了關聯型別協議,可以直接使用擴充套件指定協議。

給關聯型別新增約束

assoicatedtype可以使用冒號後加入父類名或者協議名約束型別。

在關聯型別約束裡使用協議

協議可以作為它自身的要求出現。

泛型where語句

關聯型別新增約束通過定義一個泛型where子句來實現。

具有泛型where子句的擴充套件

你也可以使用泛型where

子句作為擴充套件的一部分。

具有泛型where子句的關聯型別

你可以在關聯型別後面加上具有泛型where的字句。

泛型下標

下標可以是泛型,它們能夠包含泛型where子句。