#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