2017-11-18 72 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的依賴。

相關問題