如何在 swift 个对象上按字段检查相等性

How to check equality by field on swift objects

如何检查两个 swift 对象是否具有所有字段的保存值?

我想尽可能不费力地完成这项工作。我不想为每个对象实现 equatable 以手动实现相等性检查。

注意:我不是在检查 ID 是否相等,而是在检查所有字段是否具有相同的值。


struct Post {
    let id: Int
    let owner: User
    let comment: String
}

struct User {
    let id: Int
    let name: String
}

let user = User(id: 1, name: "Steve")
let post = Post(id: 1, owner: user, comment: "I invented iPhone")

let user2 = User(id: 1, name: "Steve")
let post2 = Post(id: 1, owner: user2, comment: "I invented iPhone")


if post == post2 {
    print("equal") // Should reach here
} else {
    print("not equal")
}

使PostUser符合Equatable协议。

struct Post: Equatable {
    let id: Int
    let owner: User
    let comment: String
}

struct User: Equatable {
    let id: Int
    let name: String
}

如果您想要自定义一致性,例如您不想检查参数 comment 是否相等,则使用:

struct Post: Equatable {
    static func == (lhs: Post, rhs: Post) -> Bool { lhs.id == rhs.id } // could add "&& lhs.owner.id == rhs.owner.id" if that's what you're going for
}

然后:

let user = User(id: 1, name: "Steve")
let post = Post(id: 1, owner: user, comment: "I invented iPhone")

let user2 = User(id: 1, name: "Steve")
let post2 = Post(id: 1, owner: user2, comment: "I invented iPhone")


if post == post2 {
    print("equal") // reaches here
} else {
    print("not equal")
}