为了协议:关联类型
关联类型
- 定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过associatedtype关键字指定
关联类型的应用
关联类型的约束
- 你可以在协议里给关联类型添加约束来要求遵循的类型满足约束
在关联类型约束里使用协议
- 协议可以作为它自身的要求出现
如何为泛型定义要求: where字句
- 如类型约束中描述的一样,类型约束允许你在泛型函数或泛型类型相关的类型形式参数上定义要求
- 类型约束在为关联类型定义要求时也很有用。通过定义一个泛型Where字句来实现。泛型Where字句让你能够要求一个关联类型必须遵循指定的协议,或者指定额类型形式参数和关联类型必须相同。泛型Where字句以Where关键字开头,后接关联类型的约束或类型和关联类型一致的关系。泛型Where字句写在一个类型或函数体的左半个大括号前面
where字句
- C1必须遵循Container协议(写作C1: Container)
- C2必须遵循Container协议(写作C2:Container)
- C1的ItemType必须和C2的ItemType相同(写作C1.ItmeType == C2.ItemType)
- C1的ItemType必须遵循Equatable协议(写作C1.ItemType: Equatable)
- someContainer是一个C1类型的容器
- anotherContainer是一个C2类型的容器
- someContainer和anotherContainer中的元素类型相同
- someContainer中的元素可以通过不等操作符(!=)检查它们是否不一样
带有泛型Where字句的扩展
- 你同时也可以使用泛型的where字句来作为扩展的一部分
关联类型的泛型Where字句
- 你可以在关联类型中包含一个泛型where字句。比如说,假定你想要做一个包含遍历器的Container,比如标准库中的Sequence协议那样
泛型下标
- 下标可以是泛型,它们可以包含泛型where分句。你可以在subscript后用尖括号来写类型占位符,你还可以在下标代码块花括号前写泛型where分句
- 在尖括号中的泛型形式参数Indices必须是遵循标准库中Sequence协议的某类型
- 下标接受单个形式参数,indices,它是一个Indices类型的实例
- 泛型where分句要求序列的遍历器必须遍历Int类型的元素。这就保证了序列中的索引都是作为容器索引的相同类型
- 合在一起,这些限定意味着传入的indices形式参数是一个整数的序列
泛型编程思想浅谈
泛型思维
- 面向过程的编程,可以将常用代码段封装在一个函数中,然后通过函数调用来达到目标代码重用的目的。面向对象的方法,则可以通过类的继承来实现(对象的目标)代码的重用
- 如果需要写一个可用于不同数据类型的算法,可以采用的方法有:
- 面向过程 -- 对源代码进行复制和修改,生成不同数据类型版本的算法函数,调用时需要对数据类型进行手工的判断
- 面向对象 -- 可以在一个类中,编写多个同名函数,它们的算法一致,但是所处理数据的类型不同,当然函数的输入参数类型也不同,可通过函数重载来自动调用对应数据类型版本的函数
- 前面两种方法都需编写了多个相同算法的不同函数,不能做到代码重用。它们二者之间的主要差别,只是调用的方便与否
- 如果采用泛型编程(例如可以采用以类型作为参数的传统C++的模板技术),就可以做到源代码级的重用
- 泛型编程 -- 编写以类型作为参数的一个模板函数,在调用时再将参数实例化为具体的数据类型
- 狮子会跑、轮船会跑、汽车会跑、博尔特也会跑。我需要把会跑的事物集合起来?