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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simpon 中级黑马   /  2016-5-10 15:15  /  6322 人查看  /  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到你的点啊 问题说详细点哈
回复 使用道具 举报
看了这篇,心中很多疑惑都解开了,继续看下去
回复 使用道具 举报
好厉害好厉害好厉害
回复 使用道具 举报
又来学习了,谢谢楼主分享
回复 使用道具 举报
哈哈哈哈哈哈哈哈
回复 使用道具 举报
戳开看看
回复 使用道具 举报
楼主强强强
回复 使用道具 举报
好东西,收藏
回复 使用道具 举报
接着看吧
回复 使用道具 举报
谢谢版主
回复 使用道具 举报
确实有点厉害
回复 使用道具 举报
TaoT 中级黑马 2016-7-27 11:34:52
14#
iOS开发入门】你真
回复 使用道具 举报
666666666666666666
回复 使用道具 举报
感谢分享  很好的文章感谢分享  很好的文章
回复 使用道具 举报
nice  ,谢谢
回复 使用道具 举报
zhendezuiless
回复 使用道具 举报
学习了学习了学习了学习了学习了
回复 使用道具 举报
好东西,谢谢分享
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马