黑马程序员技术交流社区

标题: 【iOS开发入门】你真的了解KVC吗?(上) [打印本页]

作者: Simpon    时间: 2016-5-10 15:15
标题: 【iOS开发入门】你真的了解KVC吗?(上)
本帖最后由 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里的几个方法:
赋值:
  1. - (void)setValue:(nullable id)value forKey:(NSString *)key;
  2. - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
复制代码
     解释:第一个参数传入想赋的值,第二个参数传入想接收值的属性   
  1. -(void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id>*)keyedValues;
复制代码
     解释:这种方式比较暴力,后头会解释
取值:
  1. - (nullableid)valueForKey:(NSString *)key;
  2. - (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的方式有你意想不到优点!
想看优点的话


精华推荐:
黑马程序员:为苹果与iOS开发者的前景正名
与君共勉 --- 记黑马22期同学成长经验。
【持续更新】2016年最全最新的iOS视频+软件+源码+面试/技术
关于iOS 10最新的课程视频及demo第三弹,火速发布了

作者: wendaogds    时间: 2016-5-10 23:24
KVC中所有的属性名都要以字符串的形式传入   重点来了
作者: 18316761642    时间: 2016-5-13 16:22
【iOS开发入门】你真的了解KVC吗?(上) [修改]
作者: Ar_Vic    时间: 2016-5-16 09:32
来学习了!
作者: zyp1343832    时间: 2016-5-18 23:58
可以可以,KVC受用良多
作者: 1937362521    时间: 2016-5-27 16:57
看看看看看看看看看看看看看看看看看看看看看看看看
作者: Darkhorse′Xa    时间: 2016-6-3 10:01
KVC学习了
作者: Chris_Wu    时间: 2016-6-5 17:33
戳开看看

作者: luffy99    时间: 2016-6-7 18:04
楼主强强强
作者: wodetaoshu    时间: 2016-6-19 12:22
很好,很有用
作者: 简单Life    时间: 2016-6-20 11:26
看看把 这两天要面试了
作者: zhonghphuan    时间: 2016-7-23 00:32
先看看优点
作者: TaoT    时间: 2016-7-27 11:40
你真的了解KVC吗?
作者: changee    时间: 2016-8-16 18:44
666666666666666666
作者: xiewenjian0313    时间: 2016-8-17 08:15
大长山岛
作者: lwbo_1234    时间: 2016-9-19 18:36
感谢分享  很好的文章感谢分享  很好的文章
作者: lwbo_1234    时间: 2016-9-19 18:40
感谢分享  很好的文章感谢分享  很好的文章感谢分享  很好的文章
作者: Diaw2016    时间: 2016-9-22 12:24
KVC的方式有你意想不到优点!
作者: 有无相生    时间: 2016-11-10 16:18
会把cccccccc
作者: lakulaku    时间: 2016-11-22 11:27
我来看优点
作者: geniuswen    时间: 2016-12-1 17:38
学习了学习了学习了学习了
作者: newu    时间: 2016-12-1 18:37
666666666666666666
作者: zhang987    时间: 2016-12-29 14:33
那么重点来了
作者: awenlovelearn    时间: 2016-12-30 11:59
啥优点呢
作者: AgensnMaster    时间: 2017-1-12 14:41
不了解,想进一步加深了解一下
作者: Light_Li    时间: 2017-2-15 10:05
回复可见
作者: 我狂者    时间: 2017-2-22 10:37
erty2345678
作者: robin1210    时间: 2017-2-27 11:54
有一些作用
作者: 妍飞凤舞    时间: 2017-3-6 11:09
6666666666666666666
作者: miracledebris    时间: 2017-3-9 18:41
2333333333333333
作者: 无目的废    时间: 2017-3-19 23:15
学习了

作者: awenLoveStudy    时间: 2017-3-22 15:11
https://www.bjjzzpt.comhttps://www.bjjzzpt.comhttps://www.bjjzzpt.comhttps://www.bjjzzpt.com
作者: wkf    时间: 2017-4-7 16:05
kankanxuexi
作者: hold47    时间: 2017-4-27 19:08
不错不错
作者: 18150091472    时间: 2017-5-11 16:25
666666666666
作者: べ戀¢豬そ☆    时间: 2017-5-16 21:57
优点优点
作者: yanguilai4    时间: 2017-6-16 03:48
very good article
作者: logll    时间: 2017-9-25 14:12
1
作者: wilsondex    时间: 2017-10-6 13:13
想看看KVC的应用场景~
作者: 杨璐铭    时间: 2018-1-2 11:52
12312412312312
作者: JLX    时间: 2018-2-22 14:34
hhhhhhhhhh
作者: 苏明明    时间: 2018-2-22 15:24
好的好的,我知道了,我试试
作者: ji85210    时间: 2018-2-24 16:07
hahaadsfaeadfaefasdfae
作者: xiaoliuTX    时间: 2018-2-26 14:58

作者: luodongdong    时间: 2018-4-9 15:11
大神,你好,很详细
作者: wolfhous    时间: 2018-4-10 13:55
学习学习徐谢谢
作者: baby14    时间: 2018-7-14 09:24
多谢分享
作者: aa12322    时间: 2019-1-28 11:28
斤斤计较军军军军军军军军军军军




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2