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