我有一个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
}
}
在上面的代码中,我比较了value1
和value2
String
值。这不是完全正确的方法。但我不得不这样做,因为value1
和value2
属于Any
类型,因此无法直接比较。因此,该解决方案可能不适用于Person
中的自定义类型。
这只是一种出路,以防您不想单独比较所有属性。
用法:
let p1 = Person(name: "Name1", age: 10, designation: nil)
let p2 = Person(name: "Name1", age: 10, designation: "SE")
print(p1 == p2)