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
相关产品推荐
相关产品推荐

