How to observe key path on 'Any' object in Swift 4

Mar*_*ges 6 macos key-value-observing swift swift4

我正在使用新的Swift 4 KVO和KeyPath API来观察对象的变化。具体来说,我正在尝试观察的选择对象上的某些内容NSArrayController。问题是selectionis类型Any,这似乎与生成所需的键路径不一致,因为编译器不知道type对象的任何属性Any

该属性的名称为assetPointHeight。我的代码如下所示:

var observation: NSKeyValueObservation?

observation = arrayController.observe(
    #keyPath(NSArrayController.selection.assetPointHeight),
    options: [.new],
    changeHandler: { [weak self] (_, _) in
        self?.updateLabel()
    }
)
Run Code Online (Sandbox Code Playgroud)

我收到两个编译错误:

Value无法推断通用参数
类型'Any'没有成员'assetPointHeight'

我如何才能在这里找到想要的?还有另一种生成此KeyPath的方法吗?

Wil*_*ley 1

我不希望它起作用,因为assetPointHeightis\xe2\x80\x99t 不是一个真实的属性selection(例如,it\xe2\x80\x99s 没有在源代码中的任何地方定义,it\xe2\x80\x99s 是在运行时创建的虚拟属性) 。我认为这里发生的\xe2\x80\x99s 是 Swift 4 版本observe(...)试图将该路径解析为静态类型但不能,因此它\xe2\x80\x99s 抛出错误。(观察也仅适用于NSObject子类,因此Any永远无法被观察到。)因此,在这种情况下,您必须使用传统的基于字符串的 KVO,如 \xe2\x80\x9cvadian\xe2\x80\x9d 所说。

\n