-2

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

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

4

1 回答 1

0

假设我们有一个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的值。这不是完全正确的方法。但我不得不因为并且是类型,因此不能直接比较。因此,该解决方案可能不适用于.value1value2value1value2AnyPerson

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

用法:

let p1 = Person(name: "Name1", age: 10, designation: nil)
let p2 = Person(name: "Name1", age: 10, designation: "SE")
print(p1 == p2)
于 2019-08-09T08:17:30.600 回答