我有一个带有Equatable
协议实现的类。我知道如果所有内部变量都相等,则此类的 2 个对象是相等的。对象可能包含数组。目前我对每个不灵活的值对比较进行硬编码。
如果有办法通过遍历属性列表来实现这种比较?例如Mirror
(反射)?
我有一个带有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
}
}
在上面的代码中,我比较了和String
的值。这不是完全正确的方法。但我不得不因为并且是类型,因此不能直接比较。因此,该解决方案可能不适用于.value1
value2
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)