2017-06-26 24 views
16

我有一個Swift庫,它嚴重依賴obj.valueForKey()NSObjectSwift 4「此課程不符合關鍵值編碼」

遷移到Swift 4後,我發現這些調用總是崩潰,出現錯誤「這個類不是關鍵值編碼兼容的關鍵...」,除非我要查找的屬性是用@objc

現在是否必須聲明與@objc屬性爲他們找到與此方法?有其他選擇嗎?

+6

比較[我該如何處理與#selector()在斯威夫特4 @objc推理棄用?](https://stackoverflow.com/q/44390378/2976878) – Hamish

回答

36

當您執行遷移時,Xcode詢問了有關@objc的推理,並且您可能選擇了新類型而不是Swift3。

可能的解決方案:

使用@objc

使用每一種方法@objc,根據需要而不是整個類。

使用@objcMembers

你可以只在類使用@objcMembers

將@objcMembers屬性應用於類將@objc屬性隱式添加到它的所有Objective-C兼容成員。

Writing Swift Classes and Protocols with Objective-C Behavior

請記住:因爲應用該@objc屬性可以提高應用程序的編譯大小和不利影響性能,僅適用@objcMembers上聲明屬性時,每個成員都需要有@objc屬性應用

切換推斷爲原來的行爲

你也可以改變下的項目的行爲: Build Settings>Swift 3 @objc Inference>On/Off

相關問題:

+2

最好的答案永遠。 我在對象上調用.value(forKey :)時遇到了同樣的問題,雖然它應該是NSCoding key compliant 謝謝! – Mallox

+0

謝謝,謝謝,謝謝。 @objcMembers適合我。 –

相關問題