本帖最后由 Simpon 于 2016-10-27 10:31 编辑
版权声明:本文为作者原创文章,未经作者允许不得转载。
KVC介绍及简单使用
有了解过C#的同学都知道,C#高级语法中有一种机制叫“反射”。乍一听这名字还让人摸不着头脑,还以为是啥高科技(⊙﹏⊙)。往简单了讲,无非就只是用字符串动态去操作一个对象罢了-_-!。在C#的远房表亲OC中,也有这样功能的语法,操作起来可比C#简单的太多。这部分功能就叫KVC。 KVC:Key Value Coding,取其三个单词首字母浓缩而成。直白翻译过来就是键值编码,什么意思呢?简单来说,就是操作一个对象,也可以像操作字典一样,通过key来取值和赋值。 纳尼?真有这么神奇?接下来,我就带你走入KVC的奇妙世界 我们先创建一个HMPerson类来试验一下。
注:HM为前缀,在iOS开发中用来区分是哪个框架下的类。苹果推荐所有的非苹果官方开发者都以3个字母的作为前缀,2个字母的为苹果自身保留。这里为方便起见,接下来所有创建的类,我们都以HM开头。
然后实例化HMPerson类的对象,此时,我们如果想要给它的name和age两个属性赋值和取值,就可以用点语法来操作,如图: 但是,这种点语法方式显得着实太low,接下来我们就用比较高大上的方式——KVC的方式来赋值和取值。 我们先简单看看KVC里的几个方法: 赋值: - - (void)setValue:(nullable id)value forKey:(NSString *)key;
- - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
复制代码 解释:第一个参数传入想赋的值,第二个参数传入想接收值的属性 - -(void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id>*)keyedValues;
复制代码 解释:这种方式比较暴力,后头会解释 取值: - - (nullableid)valueForKey:(NSString *)key;
- - (nullable id)valueForKeyPath:(NSString *)keyPath;
复制代码 解释:参数是传入你想取值的属性名 我们都知道,OC中任何对象都直接或间接的继承自NSObject,而在Foundation框架中,NSObject有个叫“NSKeyValueCoding”的分类,里面就包含了上面所有这些KVC方法。因此任何对象都可以通过KVC来取值和赋值,也就是说即使我们刚刚自己创建的Person类也有这些方法。 取值和赋值具体在代码中的应用如下: 我们发现KVC的方式使用起来也没任何问题。但是,很多同学会疑惑,为什么16要加个“@”符号呢?还有取值时为什么还要调用一下intValue方法呢?不这么写可不可以?答案是不行的,我们先看如果不这么写会怎样
此时发现,如果不按之前的写法会有一个错误以及一个警告。原因如下: 1. KVC中,赋值时传入的值都只能是对象类型,无法直接传入基本数据类型,因此,在给age属性赋值时,用了一个@符号,把16这个数字快速包装成了NSNumber类型(@加数字是快速创建NSNumber的语法) 2. 通过KVC取值时,所有的返回值类型都是id类型(也即对象类型),因此无法直接用基本数据类型的变量来接收,必须调用其对应的类型转换代码先进行类型转换 另外需要注意:KVC中所有的属性名都要以字符串的形式传入 此时有同学会疑问了:“我勒个去!用KVC这么麻烦,还不如直接用点语法方便多了”,对,一般情况下是这样!但是,用KVC的方式有你意想不到优点! 想看优点的话
精华推荐: |