Swift中:空协议继承组合与typealias联合协议的区别
Swift中两种协议组合方式的差异对比
下面直接对比两种写法的核心差异:
1. 本质类型区别
protocol ABProtocol: AProtocol, BProtocol {}是定义了一个全新的协议,它继承自AProtocol和BProtocol,属于独立的协议实体。typealias ABProtocol = AProtocol&BProtocol只是给AProtocol&BProtocol这个多协议组合类型起了一个别名,没有创建新类型,本质还是原组合类型本身。
2. 扩展性差异
- 新协议(第一种写法)可以自由添加额外的协议要求,比如新增方法、属性:
protocol ABProtocol: AProtocol, BProtocol { func extraMethod() // 新增协议要求 } - 类型别名(第二种写法)无法添加任何新的协议要求,只能复用AProtocol和BProtocol的现有规则。
3. 类型识别逻辑不同
- 对于第一种方式的
ABProtocol,只有明确声明遵守该协议的类型,才会被识别为ABProtocol类型。哪怕某个类型同时遵守AProtocol和BProtocol,但没声明遵守ABProtocol,用is或as?检查时也不会匹配。 - 对于第二种方式的
ABProtocol,只要类型同时遵守AProtocol和BProtocol,就会被自动识别为该别名类型,示例:struct MyStruct: AProtocol, BProtocol {} let obj = MyStruct() // 第二种写法下,结果为true print(obj is ABProtocol) // true // 第一种写法下,结果为false(MyStruct未声明遵守ABProtocol) print(obj is ABProtocol) // false
4. 使用场景不同
- 第一种写法适合需要在原有协议基础上扩展新能力,或者需要统一标记某类必须同时满足多个协议的类型时使用。
- 第二种写法适合临时简化多协议组合的代码书写,无需新增协议要求,仅为了代码简洁性时使用。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

