You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:35:29