为何含遵循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
相关产品推荐
相关产品推荐

