Swift泛型

21 阅读2分钟

泛型

泛型的发展

image.png

C++泛型

image.png

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

image.png

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

image.png

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

image.png

类型形式参数

image.png

命名类型形式参数

image.png

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

image.png

IntStack

image.png

泛型Stack

image.png

image.png

image.png

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

image.png

类型约束

image.png

类型约束语法

image.png

类型约束的应用

image.png

image.png

image.png

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

image.png

image.png

image.png

image.png

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

image.png

在关联类型约束里使用协议
  • 协议可以作为它自身的要求出现

image.png

image.png

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

image.png

image.png

image.png

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

image.png

image.png

带有泛型Where子句的扩展

image.png

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

image.png

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

image.png

泛型思维

image.png

image.png

image.png

image.png

image.png