A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simpon 中级黑马   /  2016-5-10 15:15  /  5295 人查看  /  38 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Simpon 于 2016-10-27 10:31 编辑


版权声明:本文为作者原创文章,未经作者允许不得转载。

KVC的优点合集

优点一:破门而入:与别人家的“私人专属”亲密接触

我们都知道,如果@property写在.h文件中,代表外界可以通过调用对应的setter和getter方法(或点语法)来访问对应的私有成员变量,但如果写在.m中,代表只允许本类中访问,其他地方访问不了。因此,我们给之前的Person类在.m文件中写一个延展,把.h文件的@property挪到.m的延展中。并且在.m文件中再加一个用@private修饰的成员变量
如图:

此时,我们通过点语法来给属性赋值取值即会报错,如图


但是,如果是KVC方式,此时依然坚挺!

到此为止,KVC的好处之一得到完美体现:无论类中的成员是否私有,用KVC都可以强行“破门而入”,对它们正常取值和赋值。

除此以外,还有个显而易见的好处是:KVC中不管你的成员变量是否加下划线,你用KVC取值和赋值时传入的属性名都可以不带下划线。


优点二:大大简化字典转模型代码
     很多时候,我们通过加载本地文件,或者网络请求会得到一个数据字典,为了方便调用,一般我们都会将这个字典转换为对应的模型类,但是,不用KVC的转换方法太过费劲,如图:

先有一个HMPerson类

然后有一个字典,并且把字典里的元素赋值给HMPerson对象,如下图所示:

此时用点语法相当的麻烦,如果有100个属性,就必须一个元素一个元素地写100次。但用KVC的方式如何呢?我们看代码:

有同学看到这可能会疑惑了,KVC方式也没见得有多简便啊,代码看起来更多了!对,目前来说是这样子,但是大家仔细观察,setValue和ForKey两个参数里传入的key名是不是完全一样?如图:

而这些Key,是不是刚好可以在遍历这个字典数据就可以获取到?如图:

     大家看,在这个循环里,key好像就是我们用KVC的setValue:值 forKey:键 中需要传入的“键”,而dic[key]就是正方法中需要传入的“值”。

因此,我们可以将KVC实现字典转模型的方法直接用这个循环解决,如图:
     

     看,此时是不是特别方便,代码特别简洁?哪怕以后字典有100项数据,对应实体类100个属性,再不用怕,就用这一个循环即可搞定!
                        但,这还不够简洁!KVC提供了一套更简洁的操作方式,只需你传入一个字典,就可以帮你自动把字典里的每一项赋值给你实体类对应的属性,如图:
            
对,仅需调用setValuesForKeysWithDictionary方法,传入字典即可。这个方法内部,帮我们做了我们刚刚循环字典的操作,因此仅仅这一个方法就可完成字典数据转模型数据,从此,妈妈再也不用担心我写多余代码了!

注意:用setValuesForKeysWithDictionary或者自己写循环做字典数据转模型数据时,必须保证实体类的属性跟字典中的key名字一一对应,并且属性可以比字典多,但是绝对不能比字典的元素少!
可是除此之外还是有很多在使用KVC时候遇到的问题的,那么请看


游客,如果您要查看本帖隐藏内容请回复


精华推荐:

38 个回复

倒序浏览
wendaogds 发表于 2016-5-10 23:02
属性比字典都多啊,压力很大啊

什么问题?  没get到你的点啊 问题说详细点哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马