KVC键值编码

KVC  
全称为:Key Value coding 键值编码

setValue: forKey:修改值。
valueForKey:传入属性的名字。
setValue:forKeyPath:通过键路径来修改。
valueForKeyPath:传入属性的路径就是xx.xx的形式。
KVC的优点是为安全机制完善,通过Key去查找Value的形式有助于在后期开发的设计模式上有很大的帮助。
四种编码的格式。意思就是通过键来取值
看一个实际例子;
//练习二:当猎人走进森林的时候,发现了三头野猪,野猪体重分别是100,200,300 . 但是猎人只想猎取200斤的野猪,于是他开始打猎,打猎过后发现是100斤的野猪,他继续打猎一直打到200斤的野猪,他会说一句:终于可以回家了!请用KVC的写法去实现

//练习三:如果森林也作为一个类,应该怎么实现?

main.m
#import <Foundation/Foundation.h>
#import "Person.h" 
#import "Pig.h" 
#import "Forest.h" 
int main(int argc, const char * argv[]) {
//实例化
Person *person = [[Person alloc]init];
Pig *pig = [[Pig alloc]init];
Pig *pigI = [[Pig alloc]init];
Pig *pigII = [[Pig alloc]init];

//属性设置
   [person setValue:"猎人" forKey:"name"];
   [pig setValue:"100" forKey:"weight"];
   [pigI setValue:"200" forKey:"weight"];
   [pigII setValue:"300" forKey:"weight"];
//创建森林集合,把猪放到森林里
   Forest *forestI = [[Forest alloc]init];
     NSArray *array  = @[pig , pigI , pigII];
[forestI setValue:array forKey:"array"];
   //给猎人一个目标
   [person setValue:
"200" forKey:"target"];
   //取出打猎的目标
   int target = [[person valueForKey:
"target"] intValue];
//第一次固定打到100斤猪
   for (int i = 0 ; i < [array count]; i++) {
//需要转换成野猪的类型
       Pig *pigTmp = array[i];
       //比较是否为100斤,或者转换为String ,或者int
       int weightTmp = [[pigTmp valueForKey:@"weight"]intValue];
if (weightTmp  100) {
           NSLog("不是你想要的目标!");
       }
       //往后继续打猎,直到打到200斤的为止
       if(weightTmp  target){
           NSLog(
"任务完成了");
           break;
       }else{
           NSLog("没打到就继续打!这次野猪体重为:%",[pigTmp valueForKey:@"weight"]);
       }
}

Person.h

#import <Foundation/Foundation.h>
#import "Pig.h" 
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)Pig *hunterBoar;
@property(nonatomic,assign)int target;
@end

Pig.h

#import <Foundation/Foundation.h>

@interface Pig : NSObject
@property(nonatomic,assign)int weight;
@end

Forest.h

#import <Foundation/Foundation.h>
@interface Forest : NSObject
@property(nonatomic,strong)NSArray *array;
@end

往后还有一些扩展知识!
avg:平均值
NSLog(
“猪平均体重%斤",[forestI valueForKeyPath:"array.@avg.weight"]);

count:总数
NSLog(
“猪有%个",[forestI valueForKeyPath:"array.@count"]);

max:最大
NSLog(
"最有质量猪是%斤",[forestI valueForKeyPath:"array.@max.weight"]);

min:最小
NSLog(
"都是瘦肉的猪%斤",[forestI valueForKeyPath:"array.@min.weight"]);

sum:总数
NSLog(
“猪总和%斤",[forestI valueForKeyPath:"array.@sum.weight"]);

针对数组的情况
@distinctUnionOfObjects:返回指定属性去重后的值的数组
@unionOfObjects:返回指定属性的值的数组,不去重
属性的值不能为空,否则产生异常。

NSArray *array2 = [@3,@2,@1,@2];
   NSArray *array3 = [array2 valueForKeyPath:
"unionOfObjects.self"];
   NSLog(
"—————————————%@——————————————",array3);
NSArray *array4 = [array2 valueForKeyPath:"@distinctUnionOfObjects.self"];
   NSLog(
"%@",array4);


转载于:https://my.oschina.net/u/2483168/blog/527639

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值