文档说[[使用.initial
时]:在基于块的KVO中,观察者接收到change
结构,其中使用了oldValue
。
[oldValue
具有野生型Optional<Optional<Any>>
。
由于“任何都不可比较”错误,任何直接比较形式(使用nil,.some(nil)等)均失败。
如何检查旁听者的电话是初始的?
UPDATE
嗯。我正在从某些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
)。根据文档,不得包含旧值。我应该怎么做才能确保它不被包含?
文档说[使用.initial时]:如果还指定了new,则通知中的更改字典将始终包含newKey条目,但永远不会包含oldKey条目。在块中...
guard
case let oldValue? = change.oldValue, oldValue == nil ||
(change.newValue as? Bool != oldValue as? Bool)
else
{
return
}