Swift文档Chapter 22 泛型
泛型函数可以用于任何的类型。
泛型函数
泛型函数使用T
作为占位符,交换函数的泛型写法是:
func swapTwoValues(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
它不关心实际的类型,只是要求a
和b
的类型相同。
类型参数
我们使用T
作为占位符,可以作为参数类型,函数的返回类型,还可以用作函数主体中的注释类型。可提供多个类型参数,将它们都写在尖括号中,用逗号分开。
命名类型参数
类型参数可以进行命名,例如字典Dictionary
中的Key
和Value
。当没有实际的意义的时候,可以使用T,U,V
等字母代替。一般使用大写的驼峰命名法命名。
泛型类型
Swift还允许自定义泛型类型。这些自定义类、结构体和枚举可以适用于任意类型,就像Array
,Dictionary
。
泛型扩展
对于泛型扩展的时候,不需要提供参数列表的定义,可以直接进行使用。
类型约束
类型约束语法
在一个类型参数名后面放置一个类名或者协议名,并用冒号进行分隔,来定义类型约束。泛型类型也可以使用这种方法。
func someFunction(someT: T, someU: U) {
// 这里是泛型函数的函数体部分
}
关联类型
定义一个协议时,可以声明关联类型作为协议的一部分。关联类型为协议中的某个类型提供了一个占位符名称,其代表的实际类型在协议被遵循时才会被指定。使用associatedtype
关键字制定。
扩展现有类型来指定关联类型
关联类型协议也可以进行扩展。一旦类型实现了关联类型协议,可以直接使用扩展指定协议。
给关联类型添加约束
assoicatedtype
可以使用冒号后加入父类名或者协议名约束类型。
在关联类型约束里使用协议
协议可以作为它自身的要求出现。
泛型where
语句
关联类型添加约束通过定义一个泛型where
子句来实现。
具有泛型where
子句的扩展
你也可以使用泛型where
子句作为扩展的一部分。
具有泛型where
子句的关联类型
你可以在关联类型后面加上具有泛型where
的字句。
泛型下标
下标可以是泛型,它们能够包含泛型where
子句。