Swift中使用KVC遇到的問題

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

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

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

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

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

那么我們?cè)赟wift類中定義的實(shí)例變量OC肯定是沒法訪問的了,所以在調(diào)用value(forKey:)、setValue(forKey:)等KVC方法的時(shí)候就會(huì)報(bào)找不到的錯(cuò)。

解決方法:在實(shí)例變量的前面加上@objc進(jìn)行修飾,如下:

這樣就不會(huì)拋異常了。

解釋下@objc的作用:

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

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

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

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

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

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

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