标注@Observable的Car类无法遵守Equatable协议,如何解决?
问题解决:让@Observable类Car遵守Equatable协议
可以让Car类遵守Equatable协议,你遇到的编译错误是因为@Observable宏的代码生成特性和类内部的Equatable实现冲突导致的,以下是两种可行的解决方式:
方式一:将Equatable实现移至Extension
把static ==方法从类内部移到类的extension中,避免和@Observable生成的代码冲突:
@Observable final class Car: Identifiable, Hashable { var id = UUID() var year: Int var make: String var model: String func hash(into hasher: inout Hasher) { hasher.combine(id) } init(year: Int, make: String, model: String) { self.year = year self.make = make self.model = model } } extension Car: Equatable { static func == (lhs: Car, rhs: Car) -> Bool { lhs.id == rhs.id } }
方式二:利用编译器自动合成协议实现
由于你的Car是final类,且所有存储属性(id、year、make、model)都遵守Equatable,Swift编译器可以自动为你合成Equatable和Hashable的实现。如果你只需要基于所有属性的相等性判断,可以简化代码如下:
@Observable final class Car: Identifiable, Hashable { var id = UUID() var year: Int var make: String var model: String init(year: Int, make: String, model: String) { self.year = year self.make = make self.model = model } }
如果你的需求是仅通过id判断相等性,建议使用方式一,手动指定==的逻辑。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

