iOS之KVC
/**
* KVC -- Key Value Coding (键值编码)
* 1、KVC是一种间接访问对象实例变量的方式,使用该机制不需要调用存取方法和变量实例就可以访问对象的属性
* KVC 方法存在于NSKeyValueCoding中,默认实现方式由NSObject提供
* KVC 支持带有对象值得属性,同时也支持纯数值类型和结构
* 当使用setValue:forKey:赋值时 它会自动完成对象到标量的转换
* 当使用ValueForKey取值的时候 它会完成标量向对象的转换
* 2、KVC中的基本调用包括-(id)valueForKey:(NSString *)Key; 和 -(void)setValue:(id)Value forKey:(NSString *)key;这两方法,它们以字符串的形式向对象发送消息(字符串是我们关注属性的关键)。如果不存在setter getter方法,它将在内部查找名为key或_key的实例变量。
* 3、kvc支持路径访问 用 “.” 号分隔
* 4、一对多的访问如果想NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你
* 5、可以利用kvc做一些简单的运算 sum min max avg count 运算字段必须是数值类型NSNumber或基本数据类型,计算结果是NSNumber
*/
Person *p1 = [[Person alloc] init];
[p1 setValue:@"张三"forKey:@"_name"];
[p1 setValue:@"男"forKey:@"sex"];
[p1 setValue:@24forKey:@"age"]; // @24 NSNumber的对象
NSLog(@"%@", p1);
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:@"李四",@"name", @"男", @"sex", @25, @"age", nil];
Person *p2 = [[Person alloc] init];
[p2 setValuesForKeysWithDictionary:info];
NSLog(@"%@", p2);
NSDictionary *info2 = [NSDictionary dictionaryWithObjectsAndKeys:@"王五",@"name", @"男", @"sex", @26, @"age", nil];
Person *p3 = [[Person alloc] init];
[p3 setValuesForKeysWithDictionary:info2];
NSLog(@"%@", p3);
// 一对多
NSArray *persons = [NSArray arrayWithObjects:p1, p2, p3, nil];
NSArray *names = [persons valueForKey:@"name"];
NSLog(@"%@", names);
// 简单运算
NSNumber *avgAge = [persons valueForKeyPath:@"@avg.age"];
NSNumber *count = [persons valueForKeyPath:@"name.@count"];
NSNumber *sumAge = [persons valueForKeyPath:@"@sum.age"];
NSNumber *maxAge = [persons valueForKeyPath:@"@max.age"];
NSNumber *minAge = [persons valueForKeyPath:@"@min.age"];
/**
* [xxx valueForKeyPath:@"路径key.@sum.要运算的key"] 在简单运算中先写入一个路径,在最后要运算的属性前加 @sum @avg @min @max @count等 要运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber
*/
NSLog(@"minAge:%@", minAge);
NSLog(@"maxAge:%@", maxAge);
NSLog(@"sumAge:%@", sumAge);
NSLog(@"count:%@", count);
NSLog(@"avgAge:%@", avgAge);