Swift文档Chapter 22 泛型


泛型函数可以用于任何的类型。

泛型函数

泛型函数使用T作为占位符,交换函数的泛型写法是:

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

它不关心实际的类型,只是要求ab的类型相同。

类型参数

我们使用T作为占位符,可以作为参数类型,函数的返回类型,还可以用作函数主体中的注释类型。可提供多个类型参数,将它们都写在尖括号中,用逗号分开。

命名类型参数

类型参数可以进行命名,例如字典Dictionary中的KeyValue。当没有实际的意义的时候,可以使用T,U,V等字母代替。一般使用大写的驼峰命名法命名。

泛型类型

Swift还允许自定义泛型类型。这些自定义类、结构体和枚举可以适用于任意类型,就像ArrayDictionary

泛型扩展

对于泛型扩展的时候,不需要提供参数列表的定义,可以直接进行使用。

类型约束

类型约束语法

在一个类型参数名后面放置一个类名或者协议名,并用冒号进行分隔,来定义类型约束。泛型类型也可以使用这种方法。

func someFunction(someT: T, someU: U) {
    // 这里是泛型函数的函数体部分
}

关联类型

定义一个协议时,可以声明关联类型作为协议的一部分。关联类型为协议中的某个类型提供了一个占位符名称,其代表的实际类型在协议被遵循时才会被指定。使用associatedtype关键字制定。

扩展现有类型来指定关联类型

关联类型协议也可以进行扩展。一旦类型实现了关联类型协议,可以直接使用扩展指定协议。

给关联类型添加约束

assoicatedtype可以使用冒号后加入父类名或者协议名约束类型。

在关联类型约束里使用协议

协议可以作为它自身的要求出现。

泛型where语句

关联类型添加约束通过定义一个泛型where子句来实现。

具有泛型where子句的扩展

你也可以使用泛型where子句作为扩展的一部分。

具有泛型where子句的关联类型

你可以在关联类型后面加上具有泛型where的字句。

泛型下标

下标可以是泛型,它们能够包含泛型where子句。