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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 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的方式有你意想不到优点!
想看优点的话
游客,如果您要查看本帖隐藏内容请回复


精华推荐:

47 个回复

倒序浏览
KVC中所有的属性名都要以字符串的形式传入   重点来了
回复 使用道具 举报
【iOS开发入门】你真的了解KVC吗?(上) [修改]
回复 使用道具 举报
来学习了!
回复 使用道具 举报
可以可以,KVC受用良多
回复 使用道具 举报
看看看看看看看看看看看看看看看看看看看看看看看看
回复 使用道具 举报
KVC学习了
回复 使用道具 举报
戳开看看
回复 使用道具 举报
楼主强强强
回复 使用道具 举报
很好,很有用
回复 使用道具 举报
看看把 这两天要面试了
回复 使用道具 举报
先看看优点
回复 使用道具 举报
TaoT 中级黑马 2016-7-27 11:40:38
13#
你真的了解KVC吗?
回复 使用道具 举报
666666666666666666
回复 使用道具 举报
大长山岛
回复 使用道具 举报
感谢分享  很好的文章感谢分享  很好的文章
回复 使用道具 举报
感谢分享  很好的文章感谢分享  很好的文章感谢分享  很好的文章
回复 使用道具 举报
KVC的方式有你意想不到优点!
回复 使用道具 举报
会把cccccccc
回复 使用道具 举报
我来看优点
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马