The documentation says [when .initial is used]: The change dictionary in the notification will always contain an newKey entry if new is also specified but will never contain an oldKey entry.
In block-based KVO observer receives change struct, where oldValue is used.
oldValue has wild type Optional<Optional<Any>>.
Any forms of direct comparison (with nil, .some(nil) etc) are failed because of "Any is not Comparable" error.
How can I check that the call of observer is initial?
UPDATE
Well.
I'm observing a value: Any from some attribute. Really value is constructed from binary data inside the attribute and has the type in which it was delivered, the real type is Bool? in this case. Observer is fired correctly, it is not the problem.
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
}
...
}
In initial case I have
(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
New value is nil (attribute.value == .none). Old value, in accordance with documentation, must be not contained. What should I do to ensure that it is not contained really?
It seems that I found: