В документации сказано [когда используется .initial
]: Словарь изменений в уведомлении всегда будет содержать запись newKey, если также указана новая, но никогда не будет содержать запись oldKey.
В блочном KVO наблюдатель получает change
struct, где используется oldValue
.
oldValue
имеет дикий тип Optional<Optional<Any>>
.
Любые формы прямого сравнения (с nil, .some (nil) et c) не удалось из-за ошибки «Any is not Comparable».
Как я могу проверить, что вызов наблюдателя является начальным?
ОБНОВЛЕНИЕ
Хорошо.
Я наблюдаю value: Any
от некоторых attribute
. Действительно, value
построен из двоичных данных внутри attribute
и имеет тип, в котором он был доставлен, реальный тип - Bool?
в этом случае. Наблюдатель уволен правильно, это не проблема.
observe(\ViewController.attribute.value, options: [.initial, .new, .old]) { (_self, change) in
guard change.newValue as? Bool != change.oldValue as? Bool // does not work in initial
else {
return
}
...
}
В начальном случае у меня есть
(lldb) po change
▿ NSKeyValueObservedChange<Optional<Any>>
- kind : __C.NSKeyValueChange
▿ newValue : Optional<Optional<Any>>
▿ some : Optional<Any>
- some : <null>
▿ oldValue : Optional<Optional<Any>>
- some : nil
- indexes : nil
- isPrior : false
Новое значение nil
(attribute.value == .none
). Старое значение, в соответствии с документацией, не должно содержаться. Что я должен сделать, чтобы убедиться, что он действительно не содержится?