本帖最后由 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时候遇到的问题的,那么请看
精华推荐: |