2017-11-18 44 views
0

我认为我的部分问题是因为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中本身不能使用它就很奇怪。对我而言,这表明我在某个地方误解或误用了某些东西。

+1

我知道,它感觉像往后退。任何可观察到的需要从NSObject继承。 –

+2

KVO需要Obj-C运行时执行isa调配(并且它总是*需要这个),所以如果你想观察一个属性,那么这个属性需要是'@objc dynamic'。 Swift 4唯一改变的地方就是在许多地方不再推断@ @ objc *(比较https://stackoverflow.com/q/44390378/2976878)。您可能要考虑使用'willSet' /'didSet'来覆盖KVO。 – Hamish

+0

@Hamish我想与KVO一起工作的主要原因是因为我的目标是让我在视图控制器中观察应用程序委托('已登录')中某个属性的值,并在登录状态更改时触发某些事件。有问题的ViewController卡在我的树的根目录下,在我的登录视图下面,所以我不能依赖didLoad,也不想在willAppear上触发有问题的代码。我不想给委托人一个代表,所以这似乎是最简单的。在这种情况下,它看起来像我将不得不通过通知中心来挂钩。 – RonLugge

回答

1

按照docs

在Objective-C,一个关键的是标识一个对象的特定属性的字符串。关键路径是一串由点分隔的键,指定要遍历的对象属性序列。

重要的是,#keyPath的讨论可以在标题为“与Objective-C API交互”的章节中找到。 KVO和KVC是Objective-C的特性。

文档中的所有示例显示从NSObject继承的Swift类。

最后,当您在Xcode中键入#keyPath时,自动完成功能会告诉您它期待的是@objc property sequence

enter image description here

表达式中使用#keyPath将被编译器检查(好!)进入,但是这并不能消除对Objective-C的依赖。

相关问题