黑马程序员技术交流社区
标题: 【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里的几个方法:
赋值:
- - (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的方式有你意想不到优点!
想看优点的话
精华推荐:
作者: 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 |