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