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

Swift枚举含any关联值时如何遵循Equatable协议?

解决方案

要解决ContentState中any MyError的Equatable比较问题,可以利用Swift的类型检查与强制转换,结合MyError本身遵循Equatable的特性来实现:

extension ContentState: Equatable {
  static func == (lhs: ContentState, rhs: ContentState) -> Bool {
    switch (lhs, rhs) {
    case (.loading, .loading), (.contentLoaded, .contentLoaded):
      return true
    case (.error(let lhsError), .error(let rhsError)):
      // 先判断两个错误的底层类型是否一致
      guard type(of: lhsError) == type(of: rhsError) else {
        return false
      }
      // 类型一致后,转换为具体类型并利用MyError的Equatable实现比较
      return lhsError == rhsError as! Self
    default:
      return false
    }
  }
}

关键逻辑说明:

  • 通过type(of:)判断两个any MyError的底层类型是否完全相同,类型不同直接返回false
  • 类型一致时,通过as! Self将rhsError转为与lhsError相同的具体类型,此时可直接使用MyError遵循的Equatable协议完成等值比较
  • 该方案无需修改原枚举定义,也不会引发泛型向上传播的问题,完全满足“使用枚举的类无需关心具体错误类型”的需求

内容的提问来源于stack exchange,提问作者corujautx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:42:27