定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。
而我们可以通过associatedtype关键字来指定关联类型。举个例子如下:
1 | protocol Food { |
在这里我们定义了两个协议,食物和动物,动物协议里有个需要实现的方法,吃什么食物。
然后我们又定义了两个食物和一个动物的结构体。
1 | struct Meat: Food { |
实际使用中如下:
1 | let rou = Meat() |
以上操作属于常规操作,然后有时候我们需要在实现协议中的方法时候,指定他对应的类型,就比如上面定义的Lion结构体,我们知道他是食肉动物,只吃肉,所以实现Food协议的时候只想让它接收Meat的结构体。那么就要用到associatedtype。
将动物协议中的方法传参用一个关联类型F代替,F继承于Food。
1 | protocol Animal { |
那么在Lion结构体里实现动物协议方法时候,我们将参数指定为Meat类型
1 | struct Lion: Animal { |
如上,那么在使用Lion实例的时候,只能传Meat类型的实例的Food了。
1 | let rou = Meat() |
怎么样,是不是还是挺有用的。
当时有的人会觉得我干嘛不在Lion的结构体里实现eat方法的时候,就指定是Food类型,然后判断Food是哪种具体类型,再根据不同类型做处理结果。
当然了,你要这么弄肯定是可以的,但是除了逻辑较多以外,而且这就将这块代码执行放在了运行时了,而使用关联类型,我们在编译阶段就知道是什么类型了。