Я хотел бы знать, когда изменяется набор свойств объекта Swift. Раньше я реализовал это в Objective-C, но мне сложно преобразовать его в Swift.
Мой предыдущий Objective-C код:
- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
if (![change[@"new"] isEqual:change[@"old"]])
[self edit];
}
Мой первый проход в решении Swift:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if change?[.newKey] != change?[.oldKey] { // Compiler: "Binary operator '!=' cannot be applied to two 'Any?' operands"
edit()
}
}
Однако компилятор жалуется: "Двоичный оператор '! =' не может применяться к двум" Любые? ". операнды"
Моя вторая попытка:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let newValue = change?[.newKey] as? NSObject {
if let oldValue = change?[.oldKey] as? NSObject {
if !newValue.isEqual(oldValue) {
edit()
}
}
}
}
Но, думая об этом, я не думаю, что это будет работать на примитивы быстрых объектов, таких как Int, которые (я полагаю) не наследуют от NSObject и в отличие от версии Objective-C не будут помещены в NSNumber когда они помещаются в словарь изменений.
Итак, вопрос заключается в том, как сделать кажущуюся легкую задачу определить, действительно ли значение изменяется с помощью KVO в Swift3?
Также, вопрос бонуса, как я могу использовать переменную 'объекта'? Это не позволит мне изменить имя и, конечно, не любит переменные с пробелами в них.