【问题标题】:How to check equality by field on swift objects如何在 swift 对象上按字段检查相等性
【发布时间】:2020-11-09 14:16:25
【问题描述】:

如何检查两个 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")
}

【问题讨论】:

  • 所以您想比较每个结构的“id”是否相等?也许使用自定义协议?可能使用特定的函数而不是“==”。
  • 不,我想比较来自同一类或结构的两个对象,所有字段都具有相同的值

标签: swift class struct comparison


【解决方案1】:

使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")
}

【讨论】:

  • 我不是在检查 ID 是否相等,而是检查所有字段是否具有相同的值。
  • 我的回答的第一部分就是这样做的。您不需要自定义部分。添加了简要说明。希望现在清楚了。
猜你喜欢
  • 2018-10-15
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2012-05-11
  • 2016-04-18
  • 2012-06-23
相关资源
最近更新 更多