Swift泛型
泛型
泛型的发展

C++泛型

面向对象库
模板库
template vs generic
- 模版是C++泛型编程的基础
- 泛型更来指一种编程思想
为什么需要泛型
- 下面的swapTwoInts(::)是一个标准的非泛型函数,用于交换两个Int值

- 如果你想交换两个String值,或者两个Double值,你只能再写更多的函数,比如下面的swapTwoStrings(::)和swapTwoDoubles(::)函数

- swapTwoInts(::)、swapTwoStrings(::)、swapTwoDoubles(::)函数体是一样的。唯一的区别是它们接收值类型不同(Int、String和Double)。
泛型函数的定义
- 泛型函数可以用于任何类型。这里是上面提到的swapTwoInts(::)函数的泛型版本,叫做swapTwoValues(::)

类型形式参数

命名类型形式参数

泛型类型
- 除了泛型函数,Swift允许你定义自己的泛型类型。它们是可以用于任意类型的自定义类、结构体、枚举,和Array、Dictionary方式类似。

IntStack

泛型Stack



扩展泛型类型
- 当你扩展一个泛型类型时,不需要在扩展的定义中提供类型形式参数列表。原始类型定义的类型形式参数列表在扩展体里仍然有效,并且原始类型形式参数列表名称也用于扩展类型形式参数。

类型约束

类型约束语法

类型约束的应用



关联类型
- 定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过associatedtype关键字指定。
关联类型的应用




关联类型的约束
- 你可以在协议里给关联类型添加约束来要求遵循的类型满足约束

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


swift中用协议指定泛型,必须用关联类型
泛型where子句



- 你同时也可以使用泛型的where子句来作为扩展的一部分


带有泛型Where子句的扩展

- 你可以在关联类型中包含一个泛型where子句。比如说,假定你想要做一个包含遍历器的Container,比如标准库中Sequence协议那样

泛型下标
- 下标可以是泛型,它们可以包含泛型where分局。你可以在subscript后用尖括号来写类型占位符,你可以在下标代码块花括号前写泛型where分局。

泛型思维




