IOS中Key-Value Coding (KVC)的使用详解
2015-06-10 13:14
567 查看
kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性。直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性。
下面介绍一下kvc的用法:
kvc是通过键值对的方式对属性设置值,提供了下面的方法,相当于访问器中的set方法。value为要设置的值,key是字符串,字符串中内容为为属性的名称
下面通过一个小例子讲解一下通过访问器和kvc对属性赋值的代码实现。
假设Student类中有一个name属性,直接对name赋值的方式为:
通过kvo对name进行赋值:
假设学生类中还有一个属性为ClassInfo班级类的对象stuClass,在ClassInfo班级类中有个classNo班级号的属性,下面通过直接的方式设置班级号:
通过kvc设置班级号:
通过keyPath设置时,路径由 xx.xx 表示;
value的值为OC对象,如果为基本数据类型,需要进行装箱,也就是包装为OC对象;
kvc提供了获取对象属性值的方法,相当于访问器的get方法,取值的时候也是通过键值对方式。
下面通过一个小例子讲解一下通过访问器和kvc对属性取值的代码实现。
假设要获取Student类中name的值,直接对name取值的方式为:
通过kvc取值的方式为:
通过访问器方法直接从Student类中取班级号:
通过kvc取Student类中中班级号:
默认取到的值为OC对象,如果想得到基本数据类型,需要进行拆箱操作。
使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题。
当key不存在时,会自动调用上面的这个方法,可以在这个方法中进行处理。
kvc非常好用,可以简化我们的代码,除了可以不用通过访问器方法,直接对属性进行访问外,还可以对对象中的属性进行运算。
比如新添加一个Test测试类,里面有一个score分数的属性,在Student类中有一个数组,数组中存放考试信息(Test类对象),通过kvo可以直接得到数组中存储的所有考试的平均成绩、最好成绩等。
通过kvo存储考试数组信息:
在Student类中将考试信息打印输出:
疑问咨询或技术交流,请加入官方QQ群:
(452379712)
作者:杰瑞教育
出处:http://blog.csdn.net/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
下面介绍一下kvc的用法:
1、对属性赋值
kvc是通过键值对的方式对属性设置值,提供了下面的方法,相当于访问器中的set方法。value为要设置的值,key是字符串,字符串中内容为为属性的名称- (void)setValue:(id)value forKey:(NSString *)key; - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
下面通过一个小例子讲解一下通过访问器和kvc对属性赋值的代码实现。
假设Student类中有一个name属性,直接对name赋值的方式为:
Student *stu = [[Student alloc] init]; stu.name = @"jerehedu";
通过kvo对name进行赋值:
Student *stu = [[Student alloc] init]; [stu setValue:@"jerehedu" forKey:@"name"];
假设学生类中还有一个属性为ClassInfo班级类的对象stuClass,在ClassInfo班级类中有个classNo班级号的属性,下面通过直接的方式设置班级号:
stu.stuClass = [ClassInfo new]; stu.stuClass.classNo = 1;
通过kvc设置班级号:
stu.stuClass = [ClassInfo new]; [stu setValue:@(1) forKeyPath:@"stuClass.classNo"];
通过keyPath设置时,路径由 xx.xx 表示;
value的值为OC对象,如果为基本数据类型,需要进行装箱,也就是包装为OC对象;
2、获取属性的值
kvc提供了获取对象属性值的方法,相当于访问器的get方法,取值的时候也是通过键值对方式。- (id)valueForKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath;
下面通过一个小例子讲解一下通过访问器和kvc对属性取值的代码实现。
假设要获取Student类中name的值,直接对name取值的方式为:
NSString *name = stu.name;
通过kvc取值的方式为:
NSString *name = [stu valueForKey:@"name"];
通过访问器方法直接从Student类中取班级号:
int num = stu.stuClass.classNo;
通过kvc取Student类中中班级号:
int num = [[stu valueForKeyPath:@"stuClass.classNo"] intValue];
默认取到的值为OC对象,如果想得到基本数据类型,需要进行拆箱操作。
3、key找不到时,处理异常
使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题。- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
当key不存在时,会自动调用上面的这个方法,可以在这个方法中进行处理。
4、kvc的用法补充
kvc非常好用,可以简化我们的代码,除了可以不用通过访问器方法,直接对属性进行访问外,还可以对对象中的属性进行运算。比如新添加一个Test测试类,里面有一个score分数的属性,在Student类中有一个数组,数组中存放考试信息(Test类对象),通过kvo可以直接得到数组中存储的所有考试的平均成绩、最好成绩等。
通过kvo存储考试数组信息:
NSMutableArray *ary = [NSMutableArray array]; for (int i=0; i<5; i++) { Test *test = [[Test alloc] init]; [test setValue:@(100-10*i) forKey:@"score"]; [ary addObject:test]; } stu.testAry = ary;
在Student类中将考试信息打印输出:
NSLog(@"show: testAry = %@ ",[self valueForKey:@"testAry"]); NSLog(@"show: testAry.score = %@",[self.testAry valueForKey:@"score"] ); NSLog(@"show: testAry.score = %@",[self.testAry valueForKeyPath:@"score"] ); NSLog(@"show: 数组中总成绩SUMscore = %@",[self.testAry valueForKeyPath:@"@sum.score"] ); NSLog(@"show2: 数组中平均成绩AVGscore = %@",[self.testAry valueForKeyPath:@"@avg.score"] ); NSLog(@"show2: 数组中最大成绩MAXscore = %@",[self.testAry valueForKeyPath:@"@max.score"] ); NSLog(@"show2: 数组中最小成绩MINscore = %@",[self.testAry valueForKeyPath:@"@min.score"] );[/code]
疑问咨询或技术交流,请加入官方QQ群:
(452379712)
作者:杰瑞教育
出处:http://blog.csdn.net/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- 终端(Ctrl+Alt+T)的账户是Guest,sudo和su命令都不能运行
- UITextField常用属性归纳:文本框样式、文字样式、键盘样式、左右视图样式、清除按钮设置等,iosuitextfield
- GCD学习笔记(四):dispatch_set_target_queue
- GCD学习笔记(三):Main Dispatch Queue/Global Dispatch Queue
- GCD学习笔记(二):dispatch_queue_create
- PKU 1679 The Unique MST(解题报告)
- 关于arduino的各种网站
- [转载]UIKit Dynamics入门(OC)
- iOS中UITextField用法
- setuid权限
- FreeGLUT Tips: Resolve compile issue: error LNK1104: cannot open file 'freeglutd.lib'
- quick 关于触摸的问题
- HDU-1047-Integer Inquiry(Java大数水题 && 格式恶心)
- clCreateCommandQueue': was declared deprecated
- Universal Fighting Game Guide: Understanding Combo Systems Part 1 – The Elements
- UI控件问题和XCode编译警告和错误解决方法集锦 (持续更新ing)
- 多线程-NSOperationQueue
- ugui和ngui随手记
- UIStepper
- IOS中Key-Value Coding (KVC)的使用详解