KVC :key value coding
1.赋值方法:
- setValue:forKey:
- setValue:forKeyPath:
- setValuesForKeysWithDictionary:
2.setValue:forKey: 与setValue:forKeyPath:区别
set:valueForKey:只能访问当前对象的直接属性
set:valueForKeyPath:
可以访问当前对象的简介属性,可以在外界给当前对象的私有属性直接赋值;对象的属性,无论是int,double,BOOL都可以转换成对象赋值;比如
[p setValue:@“29” forKeyPath:@“_age”]; age是double类型基本数据
[p setValue:@“29” forKeyPath:@“age”]; // 智能检测属性_age,如果发现没有age,会自动转换成_age;
- 给模型的简单属性赋值(无区别)
[p setValue:@"jack" forKey:@"name"];
[p setValue:@20.9 forKey:@"money"];
[p setValue:@"rose" forKeyPath:@"name"];
[p setValue:@"89.6" forKeyPath:@"money"];
- 给模型的复杂属性赋值(有区别)
[p.dog setValue:@"wangcai" forKeyPath:@"name"];
[p setValue:@"wangcai" forKeyPath:@"dog.name"];
[p setValue:@"wangcai" forKey:@"dog.name"]; // 错误(原因P 没有dog.name这个属性)
forKeyPath:它会按照路径查找真实属性.
forKey:它只会找这个字符串@“dog.name"
所以forKeyPath更强大,一般用它;
3.setValuesForKeysWithDictionary:
[p setValuesForKeysWithDictionary:dict];
系统会自动转换成下面代码:
p.name = dict[@“name”];
p.money =[ dict[@“money”] doubleValue];
在KVC面前没有私有属性,都是可以访问赋值的
注意
:但是KVC并不是万能的,比如人拥有一个狗的属性,狗这个类又拥有一个价格属性,它是严格按照字典中的key和values这个键值对给人的属性赋值,那么狗这个价格属性就无法用这个方法赋值,又比如字典有一个no属性,而人没有这个属性,那么就会报错;
4.取值
[p valueForKey:@“name”];
[p valueForKeyPath:@“dog.name”];
NSDictionary *dict = [p dictionaryWithValueForKeys:@[@“name”,@“money"]”];
在数组中用KVC,很少用,需要了解比如
XMGBook *book1 = [[XMGBook alloc] init];
book1.name = @"5分钟突破iOS开发";
book1.price = 10.7;
XMGBook *book2 = [[XMGBook alloc] init];
book2.name = @"4分钟突破iOS开发";
book2.price = 109.7;
XMGBook *book3 = [[XMGBook alloc] init];
book3.name = @"1分钟突破iOS开发";
book3.price = 1580.7;
p.books = @[book1, book2, book3];
如果valueForKeyPath:方法的调用者是数组,那么就是去访问数组元素(对象)的属性值
取得books数组中所有XMGBook对象的name属性值,放在一个新的数组中返回
NSArray *names = [p valueForKeyPath:@"books.name"];
NSArray *names = [p.books valueForKeyPath:@"name”];
NSLog(@"%@", names);
@count是运算符,返回数组个数
@avg返回数组的price属性的平均值
@max返回数组的price属性的最大值
@min返回数组的price属性的最小值
NSLog(@"%@", [p.books valueForKeyPath:@"@count"]);
NSLog(@"%@", [p valueForKeyPath:@"books.@count"]);
NSLog(@"%@", [p.books valueForKeyPath:@"@avg.price"]);
NSLog(@"%@", [p.books valueForKeyPath:@"@max.price"]);
NSLog(@"%@", [p.books valueForKeyPath:@“@min.price"]);
NSLog(@"%@", [p valueForKeyPath:@"books.@avg.price"]);