Swift中使用KVC遇到的問題

????OC中使用KVC是因為NSObject遵循了NSKeyValueCoding協(xié)議,而OC中所有的類包括自定義類的根類都是NSObject,所以都能使用KVC特性,但是Swift中的類其實是沒有統(tǒng)一的根類的(自定義一個類理論上也不需要繼承任何父類),所以KVC可以說是OC中的特性,????????

????要想在Swift中也使用KVC,我們就得將自定義的類繼承NSObject(理論上遵循NSKeyValueCoding協(xié)議也是可以的,但沒必要呀~)。但光是繼承是不夠的,比如下面這段代碼:

Example類已經(jīng)繼承自NSObject,這時候可以使用KVC功能獲取title的值,但是第16行代碼在調(diào)用的時候會拋出下面的運行時異常:

this class is not key value coding-compliant for the key xxxx,字面意思是沒有找到與鍵為“xxxx”兼容的鍵值對,這就奇了怪了,明明定義了這個實例變量,這里卻說找不到。

其實原因上面已經(jīng)說到過了:KVC是OC的特性!

那么我們在Swift類中定義的實例變量OC肯定是沒法訪問的了,所以在調(diào)用value(forKey:)、setValue(forKey:)等KVC方法的時候就會報找不到的錯。

解決方法:在實例變量的前面加上@objc進行修飾,如下:

這樣就不會拋異常了。

解釋下@objc的作用:

1.允許函數(shù)或?qū)傩酝ㄟ^OC的消息機制進行調(diào)用(即調(diào)用objc_msgSend,KVC其實也是基于runtime,swift貌似沒有OC的runtime機制的,Swift是靜態(tài)語言,不過可以間接使用runtime機制,后面再去花時間研究,所以上面問題的核心原理就在這里)

2.對Swift的函數(shù)或?qū)傩宰鲆粋€面向OC的翻譯,比如@objc func test()->Void{}這個方法就會被翻譯成-(void)test{}

3.其他的就等你去發(fā)覺然后告訴我啦~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,099評論 0 9
  • 柳原在細雨迷蒙的碼頭上迎接她,他說她的綠色玻璃雨衣,像一只瓶,又注了一句,藥瓶。她以為他在那里諷嘲她的孱弱,然而他...
    何必癡言簡書絕閱讀 301評論 1 0
  • 昨天和一個前任無數(shù)的男性朋友看了前任三,一邊和我看電影,一邊還要說一句早知道我就叫我前任來看了,搞不好還會來個復(fù)合...
    一席雞毛閱讀 458評論 0 2
  • 1、人的大腦中有兩套系統(tǒng),自控系統(tǒng)和本能系統(tǒng),在大多數(shù)情況下自控系統(tǒng)幫助我們抵制來自本能系統(tǒng)發(fā)起的誘惑(嗜甜是人的...
    dongbo_tree閱讀 246評論 0 0
  • 財會人對高薪的追求正如他們向往銀行和會計師事務(wù)的工作場所一樣執(zhí)著。不過,會計行業(yè)的階梯層級分明,大部分財會人還處于...
    稅語閑言閱讀 1,980評論 0 1

友情鏈接更多精彩內(nèi)容