????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ā)覺然后告訴我啦~~~