基于块的KVO中的Option NSKeyValueObservingOptions.initial

问题描述 投票:0回答:1

文档说[[使用.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

新值为nilattribute.value == .none)。根据文档,不得包含旧值。我应该怎么做才能确保它不被包含?

文档说[使用.initial时]:如果还指定了new,则通知中的更改字典将始终包含newKey条目,但永远不会包含oldKey条目。在块中...

swift5 key-value-observing ios13.4
1个回答
0
投票
似乎我找到了:

guard case let oldValue? = change.oldValue, oldValue == nil || (change.newValue as? Bool != oldValue as? Bool) else { return }

© www.soinside.com 2019 - 2024. All rights reserved.