未定义属性列表的等式协议实现?



我有一个Equatable协议实现的类。我知道,如果所有内部变量都相等,则此类的 2 个对象是相等的。对象可能包含数组。目前,我对每个不灵活的值对比较进行硬编码。

是否有办法通过遍历属性列表来实现这种比较?例如Mirror(反射(?

假设我们有一个struct Person

struct Person {
var name: String
var age: Int
}

现在你可以像这样符合其中的Equatable protocol

extension Person: Equatable {
public static func == (lhs: Person, rhs: Person) -> Bool {
let children1 = Mirror(reflecting: lhs).children
let children2 = Mirror(reflecting: rhs).children
for child1 in children1 {
let value1 = child1.value
if let value2 = children2.first(where: { $0.label == child1.label })?.value {
if String(describing: value1) != String(describing: value2) {
return false
}
} else {
return false
}
}
return true
}
}

在上面的代码中,我比较了value1value2String值。这不是完全正确的方法。但我不得不这样做,因为value1value2属于Any类型,因此无法直接比较。因此,该解决方案可能不适用于Person中的自定义类型。

这只是一种出路,以防您不想单独比较所有属性。

用法:

let p1 = Person(name: "Name1", age: 10, designation: nil)
let p2 = Person(name: "Name1", age: 10, designation: "SE")
print(p1 == p2)

相关内容

  • 没有找到相关文章

最新更新