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。

著作权声明:本文由http://www.cnblogs.com/stoic/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

转载于:https://www.cnblogs.com/zhidao-chen/archive/2012/08/06/2624880.html

Objective-C语法之KVC使用 有图有真相相关推荐

  1. 【IOS 开发】Objective - C 语法 之 流程控制

    1. if 条件语句 if 表达式 : 表达式是一个 整型 或者 布尔型, 0 或者 FALSE 为 FALSE, 大于 0 为 TRUE; 代码示例 : /********************* ...

  2. 【iOS 开发】Objective - C 语法 之 类型转换

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...

  3. objective c 语法

    与c/c++不一样的地方 1) .h 和 .m: .m是实现文件: #import导入头文件: @class类声明. 2) @property getter/setter申明: @synthesis ...

  4. 《黑马程序员》 block的使用(Objective - c语法)

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  5. 《黑马程序员》 category分类的使用(Objective - c语法)

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  6. KVC基本原理和用法

    一.基本概念 KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/s ...

  7. Pentaho BI server 中 CCC table Component 的使用小技巧

    我使用的版本 Pentaho BI Server 5.3.0.0.213 CDE/CDF/CDA/CCC 15.04.16 stable Q: 如何设置表格中各种提示文字的语言(默认为英语)? CDE ...

  8. iPhone入门教程 (视频)

    iPhone入门教程第一课(part 1):开发前的准备及帐号的注册 http://player.youku.com/player.php/sid/XMzA2NjMxMDgw/v.swf iPhone ...

  9. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

最新文章

  1. Sublime Text 3 插件的安装、升级和卸载
  2. shell脚本编程《linux下kvm虚拟机的创建、开启、显示、停止、重置》
  3. JPA关系映射之one-to-many和many-to-one
  4. iview template模式_使用Iview Menu 导航菜单(非 template/render 模式)
  5. quantum_如何从Firefox Quantum删除Pocket
  6. C/C++——一些与输入有关的istream类成员函数
  7. 【ElasticSearch】ElasticSearch 6 IK 同义词 配置
  8. rsa加解密的内容超长的问题解决
  9. TensorFlow精进之路(十):循环神经网络RNN
  10. Agile敏捷开发Planning Poker简介
  11. python数据库教程_python使用mysql操作教程
  12. VS2013 ConsoleApplication1.exe”(Win32):无法查找或打开 PDB 文件。
  13. LaTex笔记二:visio画图并保存为eps格式
  14. 一个TCP FIN_WAIT2状态细节引发的感慨
  15. 【图】公路车为什么最好不要用脚撑
  16. 苹果手机itunes显示无法连接服务器,苹果手机无法连接到iTunes Store怎么办 连接失败解决方法...
  17. 249PHP等于多少钱,一百万新台币等于多少人民币
  18. 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”
  19. A4纸和一寸照在屏幕的尺寸计算
  20. 2023美赛春季赛Z题模型代码

热门文章

  1. java 遍历对象_java中some(),every()循环遍历,Object.getOwnPropertyNames()遍历对象的属性...
  2. 【收藏】快速排查无线AP故障的十种方法
  3. AHPA:开启 Kubernetes 弹性预测之门
  4. 移植 Python 量化交易 TA-Lib 库到函数计算
  5. c语言如何判断密码不同字符,C语言从文本文档读取字符串(用户名和密码验证)...
  6. sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库
  7. java comparable接口_Java面试题之Java集合篇三
  8. php mysql 博客制作_PHP实现简易blog的制作
  9. 【百家稷学】深度学习与嵌入式平台AI实践(北京交通大学实训)
  10. 深度学习的150多篇文章和10多个专栏推荐