现在一切都清楚了:一个那天早些时候去过思里博尔的人;一个熟悉艾克罗伊德并知道他买了一台口述录音机的人;一个懂得机械原理的人;一个有机会在弗洛拉小姐到来前从银柜拿走剑的人;一个拿着装得下口述录音机的容器(比如一只黑包)的人;一个在帕克给警察打电话时能单独在书房里呆几分钟的人。事实上这个人就是——谢泼德医生!
—— 赫尔克里·波洛
1. Swift的协议
作为一门面向协议的语言,Swift通过协议、或者说protocol,来表达特定的概念。比如Equatable protocol
表达的概念就是可比较相等性,Comparable protocol
表达的概念就是不仅可以比较相等性,还可以比较顺序性(因为Comparable
继承于Equatable
)。
Swift的protocol
有两个超赞的特性:
protocol
是可以继承的,这使protocol
有了面向对象的特性,有利于复杂系统的设计。protocol
中的方法或属性可以有默认的实现,这是protocol
真正的威力所在。比如你有一个类,你打算让这个类遵从collection
协议,你所要做的就是实现七个必须的方法,然后你就可以使用collection
协议中定义的上百个方法了,因为那些方法全部通过这七个方法实现。
但是,Swift 4.0标准库中定义了超过60个协议,这些协议相互继承,而且每个协议被多个类型遵守,每个类型又遵守多个协议,可以说是一团乱麻,让每一个想深入了解Swift标准库的人望而生畏。
在这系列文章中,我将带领大家穿越迷雾,深入探究Swift标准库的源代码,看看Swift是怎样在一团乱麻的协议族之上建立起一个复杂完备的类型系统的。
我们从最平凡的类型:Int32
说起。
2. 一个Int32的诞生
Int32
是什么?“一个32位有符号整数类型”。这个回答很正确,却没什么实际价值,因为我们还是不知道能用Int32
干什么。想知道Int32
能干啥,就得看看Int32
是怎样定义的。下面这张图是我根据Int32
的定义生成的:
可以看到,即使是Int32
这样一个平凡类型,也实现了相当多的协议,表达了复杂的概念。
Int32
到底表达了什么样的概念,我们下回接着说。