首页 > 代码库 > iOS之KVC

iOS之KVC

/**

     *  KVC -- Key Value Coding (键值编码)

     * 1KVC是一种间接访问对象实例变量的方式,使用该机制不需要调用存取方法和变量实例就可以访问对象的属性

     *   KVC 方法存在于NSKeyValueCoding中,默认实现方式由NSObject提供

     *   KVC 支持带有对象值得属性,同时也支持纯数值类型和结构

     *   当使用setValue:forKey:赋值时 它会自动完成对象到标量的转换

     *   当使用ValueForKey取值的时候 它会完成标量向对象的转换

     * 2KVC中的基本调用包括-idvalueForKey:(NSString *)Key; -voidsetValue:(id)Value forKey:(NSString *)key;这两方法,它们以字符串的形式向对象发送消息(字符串是我们关注属性的关键)。如果不存在setter getter方法,它将在内部查找名为key_key的实例变量。

     * 3kvc支持路径访问 “.” 号分隔

     * 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);