KVC学习笔记

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"]);
新鲜出炉的菜鸟一枚,希望大家能互相切磋,互相琢磨,共同进步!
原文地址:https://www.cnblogs.com/lidaxia/p/4751329.html