Swift: проверка того, что 2 объекта из одного класса имеют разные значения?

#swift

#swift

Вопрос:

Я использую swift в своем проекте. У меня есть 2 объекта из одного класса (например, объект A и объект B из класса MyClass):

 class MyClass: NSObject {
    var someString: String = ""
    var someInt: Int = 0
}
...
let A = MyClass()
A.someString = "A object"
A.someInt = 1

let B = MyClass()
B.someString = "B object"
B.someInt = 2
  

как я могу проверить, имеют ли одинаковые свойства одинаковое значение, и если не возвращают значение и ключ свойства?

Я думаю, что мы можем сделать это с помощью зеркала с 2 циклами for внутри друг друга, я пишу?

Комментарии:

1. Вам нужно сделать это для любого класса или только для определенного?

2. для определенного класса

3. Значит, вы могли бы просто сделать что-то вроде if a.someString != b.someString { return ("someString", a.someString) } в функции?

4. Я использовал какой-то простой класс (всего 2 свойства), представьте класс с 20 свойствами. тогда что мне делать?

5. Да, но тогда вам нужно было бы написать определенный код для каждого свойства, который, как у меня сложилось впечатление, вы не хотели.

Ответ №1:

Я думаю, вы ищете что-то вроде этого в значительной степени:

 import Foundation

class MyClass {
    var someString: String = ""
    var someInt: Int = 0
}

let a = MyClass()
a.someString = "A object"
a.someInt = 1

let b = MyClass()
b.someString = "B object"
b.someInt = 2

func compare<T: MyClass>(_ instance: T, with instance2: T) -> [String: AnyHashable] {
    let sourceMirror = Mirror(reflecting: instance)
    let targetMirror = Mirror(reflecting: instance2)
    
    var output = [String: AnyHashable]()
    
    for sourceChild in sourceMirror.children {
        guard let label = sourceChild.label else { continue }
        
        guard let targetChild = (targetMirror.children.first { $0.label! == label }) else {
            fatalError("Failed to find target child, since types are same this fatal error should not be fired")
        }
        
        guard
            let firstValue = sourceChild.value as? AnyHashable,
            let secondValue = targetChild.value as? AnyHashable
        else {
            continue
        }
        
        guard firstValue != secondValue else { continue }
        
        output[label] = secondValue
    }
    
    return output
}

for result in compare(a, with: b) {
    print("label: (result.key), value: (result.value)")
}
  

Недостатком этого метода является то, что все ваши поля должны соответствовать протоколу Hashable, если вы хотите увидеть разницу между ними.

Вывод:

 label: someInt, value: 2
label: someString, value: B object