Swift中使用KVC遇到的问题

    OC中使用KVC是因为NSObject遵循了NSKeyValueCoding协议,而OC中所有的类包括自定义类的根类都是NSObject,所以都能使用KVC特性,但是Swift中的类其实是没有统一的根类的(自定义一个类理论上也不需要继承任何父类),所以KVC可以说是OC中的特性,        

    要想在Swift中也使用KVC,我们就得将自定义的类继承NSObject(理论上遵循NSKeyValueCoding协议也是可以的,但没必要呀~)。但光是继承是不够的,比如下面这段代码:

Example类已经继承自NSObject,这时候可以使用KVC功能获取title的值,但是第16行代码在调用的时候会抛出下面的运行时异常:

this class is not key value coding-compliant for the key xxxx,字面意思是没有找到与键为“xxxx”兼容的键值对,这就奇了怪了,明明定义了这个实例变量,这里却说找不到。

其实原因上面已经说到过了:KVC是OC的特性!

那么我们在Swift类中定义的实例变量OC肯定是没法访问的了,所以在调用value(forKey:)、setValue(forKey:)等KVC方法的时候就会报找不到的错。

解决方法:在实例变量的前面加上@objc进行修饰,如下:

这样就不会抛异常了。

解释下@objc的作用:

1.允许函数或属性通过OC的消息机制进行调用(即调用objc_msgSend,KVC其实也是基于runtime,swift貌似没有OC的runtime机制的,Swift是静态语言,不过可以间接使用runtime机制,后面再去花时间研究,所以上面问题的核心原理就在这里)

2.对Swift的函数或属性做一个面向OC的翻译,比如@objc func test()->Void{}这个方法就会被翻译成-(void)test{}

3.其他的就等你去发觉然后告诉我啦~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,883评论 0 9
  • 柳原在细雨迷蒙的码头上迎接她,他说她的绿色玻璃雨衣,像一只瓶,又注了一句,药瓶。她以为他在那里讽嘲她的孱弱,然而他...
    何必痴言简书绝阅读 1,886评论 1 0
  • 昨天和一个前任无数的男性朋友看了前任三,一边和我看电影,一边还要说一句早知道我就叫我前任来看了,搞不好还会来个复合...
    一席鸡毛阅读 3,034评论 0 2
  • 1、人的大脑中有两套系统,自控系统和本能系统,在大多数情况下自控系统帮助我们抵制来自本能系统发起的诱惑(嗜甜是人的...
    dongbo_tree阅读 1,540评论 0 0
  • 财会人对高薪的追求正如他们向往银行和会计师事务的工作场所一样执着。不过,会计行业的阶梯层级分明,大部分财会人还处于...
    税语闲言阅读 5,854评论 0 1

友情链接更多精彩内容