Object-c基础编程学习笔记-键值编码

1、首先,先做一个模型,用来说明

@interface Car : NSObject <NFirstCopying>

@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *make;
@property (nonatomic,copy)NSString *mode;
@property (nonatomic,strong)Engine *engine;
@property (nonatomic,strong)NSMutableArray *tiers;

@end

2、KVC中基本调用包括 -valueForKey -setValue:forKey:

NSString *name = [car valueForKey:@"name"];
NSLog(@"%@",name);

valueForKey:首先查找以键-key或-iskey命名的getter方法,如果不存在,则在对象内部查找名为_key或者key的实例变量,如果仍然没有,则报错

对于-setValue:forKey:和-valueForKey一样,也会先查找-setName,如果不存在,则在类中查找名为name或_name的变量,进行赋值

而且KVC有自动包装功能

3、路径

@interface Engine : NSObject <NSCopying>
{
    int horsepower;
}
@end //Engine
- id init
{
    if(self = [super init])
    {
        horsepower = 145;
    }
    return (self);
}

我们想设置一下马力,这样捉

[engine setValue: [NSNumber numberWithInt:150] forKey: @"horsepower"];
NSLog(@"horsepower is %@",[engine valueForKey:@"horsepwoer"]);

当然,这不是我们要讲的路径,下面我们来看看路径,这样比一些列的嵌套方法调用更容易访问对象

NSLog(@"horsepower is %@",[car valueForKeyPath: @"engine.horsepower"]);

4、整体操作

对于KVC来说,如果想NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。

对于这个demo来说,Car和Tire之间是一对多的关系。

NSArray *pressures = [car valueForKeyPath: @"tires.pressure"];
NSLog(@"pressures %@", pressures);

这里,程序会向NSArray中的每一个对象,发送一个valueForKeyPath:消息,并且使用pressure作为键路径

5、一些方法

让我们先来加一个类Garage

@class Car

@interface Garage : NSObject

@property (nonatomic,copy)NSString *name;
@property(nonatomic,strong)NSMutableArray *cars;

- (void) addCar: (Car *) car;

然后声明一个这个类的对象

然后调用这个对象的添加,向其中添加一些对象

Garage *garage = [[Garage alloc]init];
[garage addCar:...];
NSNumber *count;
count = [garage valueForKeyPath:@"cars.@count"];

NSNumber *sum;
sum = [garage valueForKeyPath: @"cars.@sum.mileage"];

NSNumber *avgMileage;
avgMileage = [garage valueForKeyPath: @"cars.@avg.mileage"];

按照某一种属性,进行groupBy

NSArray *manufacturers;
manufacturers = [garage valueForKeyPath: @"cars.@distinctUnionOfObjects.make"];

如果想单独使用的时候,一定记得要在distinct前面加@

6、使用空

如果想为某一个位置设置空,那么应该

-setNilValueForKey:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值