Objective-C语法之KVC使用 有图有真相
Objective-C语法之KVC使用
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。
下图来自苹果官网:
如何使用KVC存取对象属性呢?看个示例
1、使用KVC
定义一个Student类,继承于NSObject。
.h文件
#import <Foundation/Foundation.h>@interface Student : NSObject {NSString *name; } @end
.m文件
#import "Student.h"@implementation Student@end
.m文件也没有实现。name属性没有加property,原来的访问方法就访问不了name属性了。怎么办呢?用kvc就可以了
#import "Student.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"张三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"学生姓名:%@",name);}return 0; }
打印结果:
2012-07-20 15:04:09.920 objectiveC[1977:403] 学生姓名:张三
张三 这个值存进去了,通过valueForKey取出来了。
如果存的时候key和类属性的名称不一致会怎么样呢?
代码改成
[student setValue:@"张三" forKey:@"name1"];
运行,程序崩溃 ,打印:
2012-07-20 15:09:40.432 objectiveC[2069:403] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Student 0x106f14270> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name1.'
提示没有这个name1 这个key。
2、键路径访问属性
如果访问这个类里中的属性中的属性呢?那就用到了键路径
关键字:键路径取值valueForKeyPath 键路径存值:forKeyPath
新建一个类Course,课程类,课程类有课程名称这个属性
.h文件
#import <Foundation/Foundation.h>@interface Course : NSObject {NSString *CourseName; } @end
.m文件
#import "Course.h"@implementation Course@end
在Student中添加Course属性 ,student.h文件中代码如下:
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course; } @end
实现还是什么都没有,这里就不贴代码了
在main方法中,我们实验通过键路径访问Course中CourseName的属性
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"张三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"学生姓名:%@",name);Course *course = [[[Course alloc]init] autorelease];[course setValue:@"语文课" forKey:@"CourseName"];[student setValue:course forKey:@"course"];NSString *courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"课程名称:%@", courseName);//也可以这样存值[student setValue:@"数学课" forKeyPath:@"course.CourseName"];courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"课程名称:%@", courseName);}return 0; }
运行打印结果:
2012-07-20 15:33:51.902 objectiveC[2415:403] 学生姓名:张三
2012-07-20 15:33:51.904 objectiveC[2415:403] 课程名称:语文课
2012-07-20 15:33:51.904 objectiveC[2415:403] 课程名称:数学课
3、自动封装基本数据类型
我们在Student类中添加分数属性 NSInteger point;
.h文件
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course;NSInteger point; } @end
.m文件不改变
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"张三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"学生姓名:%@",name);Course *course = [[[Course alloc]init] autorelease];[course setValue:@"语文课" forKey:@"CourseName"];[student setValue:course forKey:@"course"];NSString *courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"课程名称:%@", courseName);//也可以这样存值[student setValue:@"数学课" forKeyPath:@"course.CourseName"];courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"课程名称:%@", courseName);[student setValue:@"88" forKeyPath:@"point"];NSString *point = [student valueForKey:@"point"];NSLog(@"分数:%@", point);}return 0; }
打印结果:
2012-07-20 15:43:19.593 objectiveC[2533:403] 学生姓名:张三
2012-07-20 15:43:19.596 objectiveC[2533:403] 课程名称:语文课
2012-07-20 15:43:19.596 objectiveC[2533:403] 课程名称:数学课
2012-07-20 15:43:19.598 objectiveC[2533:403] 分数:88
我们用NSString*类型设置的属性值@"88",而我们的属性是NSInteger类型的,存取都没有问题。
4、操作集合
在Student类中加入数组NSArray,用来表示其他的学生。这样我们可以添加多个其他的学生,再用集合操作计算学生的分数,最高分,最低分,平均分等
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course;NSInteger point;NSArray *otherStudent; } @end
.m文件实现不变。
在main函数中添加三个学生,添加到数组中,然后求平均分,最高,最低分,学生数量
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"张三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"学生姓名:%@",name);[student setValue:@"88" forKey:@"point"];NSString *point = [student valueForKey:@"point"];NSLog(@"分数:%@", point);Student *student1 = [[[Student alloc]init]autorelease];Student *student2 = [[[Student alloc]init]autorelease];Student *student3 = [[[Student alloc]init]autorelease];[student1 setValue:@"65" forKey:@"point"];[student2 setValue:@"77" forKey:@"point"];[student3 setValue:@"99" forKey:@"point"];NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];[student setValue:array forKey:@"otherStudent"];NSLog(@"其他学生的成绩%@", [student valueForKeyPath:@"otherStudent.point"]);NSLog(@"共%@个学生", [student valueForKeyPath:@"otherStudent.@count"]);NSLog(@"最高成绩:%@", [student valueForKeyPath:@"otherStudent.@max.point"]);NSLog(@"最低成绩:%@", [student valueForKeyPath:@"otherStudent.@min.point"]);NSLog(@"平均成绩:%@", [student valueForKeyPath:@"otherStudent.@avg.point"]);}return 0; }
运行打印结果
2012-07-20 16:09:17.101 objectiveC[2857:403] 学生姓名:张三
2012-07-20 16:09:17.104 objectiveC[2857:403] 分数:88
2012-07-20 16:09:17.105 objectiveC[2857:403] 其他学生的成绩(
65,
77,
99
)
2012-07-20 16:09:17.106 objectiveC[2857:403] 共3个学生
2012-07-20 16:09:17.106 objectiveC[2857:403] 最高成绩:99
2012-07-20 16:09:17.107 objectiveC[2857:403] 最低成绩:65
2012-07-20 16:09:17.108 objectiveC[2857:403] 平均成绩:80.333333333333333333333333333333333333
还可以求总和 @sum。
转载于:https://www.cnblogs.com/zhidao-chen/archive/2012/08/06/2624880.html
Objective-C语法之KVC使用 有图有真相相关推荐
- 【IOS 开发】Objective - C 语法 之 流程控制
1. if 条件语句 if 表达式 : 表达式是一个 整型 或者 布尔型, 0 或者 FALSE 为 FALSE, 大于 0 为 TRUE; 代码示例 : /********************* ...
- 【iOS 开发】Objective - C 语法 之 类型转换
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...
- objective c 语法
与c/c++不一样的地方 1) .h 和 .m: .m是实现文件: #import导入头文件: @class类声明. 2) @property getter/setter申明: @synthesis ...
- 《黑马程序员》 block的使用(Objective - c语法)
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
- 《黑马程序员》 category分类的使用(Objective - c语法)
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
- KVC基本原理和用法
一.基本概念 KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/s ...
- Pentaho BI server 中 CCC table Component 的使用小技巧
我使用的版本 Pentaho BI Server 5.3.0.0.213 CDE/CDF/CDA/CCC 15.04.16 stable Q: 如何设置表格中各种提示文字的语言(默认为英语)? CDE ...
- iPhone入门教程 (视频)
iPhone入门教程第一课(part 1):开发前的准备及帐号的注册 http://player.youku.com/player.php/sid/XMzA2NjMxMDgw/v.swf iPhone ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
最新文章
- Sublime Text 3 插件的安装、升级和卸载
- shell脚本编程《linux下kvm虚拟机的创建、开启、显示、停止、重置》
- JPA关系映射之one-to-many和many-to-one
- iview template模式_使用Iview Menu 导航菜单(非 template/render 模式)
- quantum_如何从Firefox Quantum删除Pocket
- C/C++——一些与输入有关的istream类成员函数
- 【ElasticSearch】ElasticSearch 6 IK 同义词 配置
- rsa加解密的内容超长的问题解决
- TensorFlow精进之路(十):循环神经网络RNN
- Agile敏捷开发Planning Poker简介
- python数据库教程_python使用mysql操作教程
- VS2013 ConsoleApplication1.exe”(Win32):无法查找或打开 PDB 文件。
- LaTex笔记二:visio画图并保存为eps格式
- 一个TCP FIN_WAIT2状态细节引发的感慨
- 【图】公路车为什么最好不要用脚撑
- 苹果手机itunes显示无法连接服务器,苹果手机无法连接到iTunes Store怎么办 连接失败解决方法...
- 249PHP等于多少钱,一百万新台币等于多少人民币
- 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”
- A4纸和一寸照在屏幕的尺寸计算
- 2023美赛春季赛Z题模型代码
热门文章
- java 遍历对象_java中some(),every()循环遍历,Object.getOwnPropertyNames()遍历对象的属性...
- 【收藏】快速排查无线AP故障的十种方法
- AHPA:开启 Kubernetes 弹性预测之门
- 移植 Python 量化交易 TA-Lib 库到函数计算
- c语言如何判断密码不同字符,C语言从文本文档读取字符串(用户名和密码验证)...
- sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库
- java comparable接口_Java面试题之Java集合篇三
- php mysql 博客制作_PHP实现简易blog的制作
- 【百家稷学】深度学习与嵌入式平台AI实践(北京交通大学实训)
- 深度学习的150多篇文章和10多个专栏推荐