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

标注@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:03:25