我认为我的部分问题是因为Swift 4改变了像@objc这样的工作方式。如何在Swift 4中使用#keyPath()?
有很多教程浮动,有很多不同的值,我不能选择什么样的版本足以弄清楚如何使它在此版本。
let delegate = UIApplication.shared.delegate as! AppDelegate
delegate.addObserver(self, forKeyPath: #keyPath(AppDelegate.session), options: [], context: nil)
//Warning: Argument of #keyPath refers to non-'@objc' property 'session'
添加@objc到变量声明只是告诉我,APISession不能客观C.这似乎对我要求暴露每一个类/变量的带领下来路径引用我想使用这个工具与Obj-C一样,而且看起来倒退了 - 这是一个更新的特性,据我了解,而且苹果公司在Swift中本身不能使用它就很奇怪。对我而言,这表明我在某个地方误解或误用了某些东西。
我知道,它感觉像往后退。任何可观察到的需要从NSObject继承。 –
KVO需要Obj-C运行时执行isa调配(并且它总是*需要这个),所以如果你想观察一个属性,那么这个属性需要是'@objc dynamic'。 Swift 4唯一改变的地方就是在许多地方不再推断@ @ objc *(比较https://stackoverflow.com/q/44390378/2976878)。您可能要考虑使用'willSet' /'didSet'来覆盖KVO。 – Hamish
@Hamish我想与KVO一起工作的主要原因是因为我的目标是让我在视图控制器中观察应用程序委托('已登录')中某个属性的值,并在登录状态更改时触发某些事件。有问题的ViewController卡在我的树的根目录下,在我的登录视图下面,所以我不能依赖didLoad,也不想在willAppear上触发有问题的代码。我不想给委托人一个代表,所以这似乎是最简单的。在这种情况下,它看起来像我将不得不通过通知中心来挂钩。 – RonLugge