iOS 【IOS中Key-Value Coding (KVC)的使用详解】

KVC,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性。直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性。

  下面介绍一下kvc的用法:

1、对属性赋值

  kvc是通过键值对的方式对属性设置值,提供了下面的方法,相当于访问器中的set方法。value为要设置的值,key是字符串,字符串中内容为为属性的名称

  1. - (void)setValue:(id)value forKey:(NSString *)key;  
  2. - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;  

  下面通过一个小例子讲解一下通过访问器和kvc对属性赋值的代码实现。

  假设Student类中有一个name属性,直接对name赋值的方式为:

  1. Student *stu = [[Student alloc] init];   
  2. stu.name = @jerehedu;  

  

       通过kvo对name进行赋值:

  1. Student *stu = [[Student alloc] init];   
  2. [stu setValue:@jerehedu forKey:@name];  

  假设学生类中还有一个属性为ClassInfo班级类的对象stuClass,在ClassInfo班级类中有个classNo班级号的属性,下面通过直接的方式设置班级号:

  1. stu.stuClass = [ClassInfo new];   
  2. stu.stuClass.classNo = 1;  

  

       通过kvc设置班级号:

  1. stu.stuClass = [ClassInfo new];   
  2. [stu setValue:@(1) forKeyPath:@stuClass.classNo];  

  通过keyPath设置时,路径由 xx.xx 表示;

  value的值为OC对象,如果为基本数据类型,需要进行装箱,也就是包装为OC对象;

2、获取属性的值

  kvc提供了获取对象属性值的方法,相当于访问器的get方法,取值的时候也是通过键值对方式。

  1. - (id)valueForKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath;  

  

       下面通过一个小例子讲解一下通过访问器和kvc对属性取值的代码实现。

  假设要获取Student类中name的值,直接对name取值的方式为:

  1. NSString *name = stu.name;  

  通过kvc取值的方式为:

  1. NSString *name = [stu valueForKey:@name];  

  通过访问器方法直接从Student类中取班级号:

  1. int num = stu.stuClass.classNo;  

  通过kvc取Student类中中班级号:

  1. int num = [[stu valueForKeyPath:@stuClass.classNo] intValue];  

  默认取到的值为OC对象,如果想得到基本数据类型,需要进行拆箱操作。

3、key找不到时,处理异常

  使用kvc时,如果代码中的key值不存在,会抛出异常,可以在类中通过重写它提供下面的这个方法来解决这个问题。

  1. - (void)setValue:(id)value forUndefinedKey:(NSString *)key;  

  当key不存在时,会自动调用上面的这个方法,可以在这个方法中进行处理。

4、kvc的用法补充

  kvc非常好用,可以简化我们的代码,除了可以不用通过访问器方法,直接对属性进行访问外,还可以对对象中的属性进行运算。

  比如新添加一个Test测试类,里面有一个score分数的属性,在Student类中有一个数组,数组中存放考试信息(Test类对象),通过kvo可以直接得到数组中存储的所有考试的平均成绩、最好成绩等。

  通过kvo存储考试数组信息:

  1. 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类中将考试信息打印输出:

  1. NSLog(@show: testAry = %@ ,[self valueForKey:@testAry]);   
  2. NSLog(@show: testAry.score = %@,[self.testAry valueForKey:@score] );   
  3. NSLog(@show: testAry.score = %@,[self.testAry valueForKeyPath:@score] );   
  4. NSLog(@show: 数组中总成绩SUMscore = %@,[self.testAry valueForKeyPath:@@sum.score] );   
  5. NSLog(@show2: 数组中平均成绩AVGscore = %@,[self.testAry valueForKeyPath:@@avg.score] );   
  6. NSLog(@show2: 数组中最大成绩MAXscore = %@,[self.testAry valueForKeyPath:@@max.score] );   
  7. NSLog(@show2: 数组中最小成绩MINscore = %@,[self.testAry valueForKeyPath:@@min.score] ); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值