泛型能根据自定义的需求,编写出适用于任意类型的、灵活可复用的函数及类型。
泛型函数
泛型版本的函数使用占位符类型名(这里叫做 T ),而不是 实际类型名(例如 Int、String 或 Double),占位符类型名并不关心 T 具体的类型,但它要求 a 和b 必须是相同的类型,T 的实际类型由每次调用 swapTwoValues(:😃 来决定。
//泛型函数
func swapTwoValues<T>(_ a: inout T, _ b: inout T){
let temporaryA = a
a = b
b = temporaryA
}
类型参数
占位类型 T 是一个类型参数的例子,类型参数指定并命名一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(例如< T >)。
命名参数
类型参数具有描述下的名称,例如字典 Dictionary<Key, Value> 中的 Key 和 Value 及数组 Array 中的 Element,这能告诉阅读代码的人这些参数类型与泛型类型或函数之间的关系。
泛型类型
泛型函数,自定义泛型类型。
//泛型类型
struct Stack<Element> {
var items = [Element]()
mutating func push(_ item: Element)