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

为何含遵循Equatable协议属性的结构体A不遵循Equatable?

问题解答

报错原因

编译器报错 Type 'A' does not conform to protocol 'Equatable' 的核心原因:

  • 结构体A的属性simp是存在类型any Accessible,虽然Accessible协议遵循Equatable且扩展提供了默认实现,但存在类型本身不满足Equatable要求——any Accessible可指代任意遵循Accessible的具体类型,两个any Accessible实例可能属于不同具体类型,此时无法用Accessible扩展的==方法比较(该方法要求左右操作数为同一具体类型)。
  • 声明遵循Equatable的结构体,若依赖编译器自动合成==方法,要求所有属性必须遵循Equatable。由于any Accessible不满足条件,编译器无法自动合成,且未手动实现A的==方法,因此触发报错。

解决方案

方案1:手动实现A的Equatable方法

先判断两个simp的底层具体类型是否一致,再执行比较:

struct A: Equatable {
    var simp: any Accessible
    
    static func ==(lhs: A, rhs: A) -> Bool {
        guard type(of: lhs.simp) == type(of: rhs.simp) else {
            return false
        }
        return lhs.simp == rhs.simp
    }
}

方案2:将A改为泛型结构体(适用于不需要支持任意Accessible类型的场景)

如果simp的类型是固定的某类遵循Accessible的具体类型,泛型版本可让编译器自动合成Equatable实现:

struct A<T: Accessible>: Equatable {
    var simp: T
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:40:15