31.9. 协议合成类型

协议合成类型定义了一种遵循协议列表中每个指定协议的类型,或者一个现有类型的子类并遵循协议列表中每个指定协议。协议合成类型只能用在类型注解、泛型形参子句和泛型 where 子句中指定类型。

协议合成类型的形式如下:Protocol 1 & Procotol 2

协议合成类型允许你指定一个值,其类型遵循多个协议的要求而不需要定义一个新的命名型协议来继承它想要符合的各个协议。比如,协议合成类型 Protocol A & Protocol B & Protocol C 等效于一个从 Protocol AProtocol BProtocol C 继承而来的新协议。同样的,你可以使用 SuperClass & ProtocolA 来取代声明一个新的协议作为 SuperClass 的子类并遵循 ProtocolA

协议合成列表中的每一项都必须是下面所列情况之一,列表中最多只能包含一个类:

  • 类名
  • 协议名
  • 一个类型别名,它的潜在类型是一个协议合成类型、一个协议或者一个类

当协议合成类型包含类型别名时,同一个协议可能多次出现在定义中 — 重复被忽略。例如,下面代码中定义的 PQR 等同于 P & Q & R

typealias PQ = P & Q
typealias PQR = PQ & Q & R

协议合成类型语法

protocol-composition-type

协议合成类型 → 协议标识符 & 协议合成延续

protocol-composition-continuation

协议合成延续 → 协议标识符 | 协议合成类型