• 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"]);
    新鲜出炉的菜鸟一枚,希望大家能互相切磋,互相琢磨,共同进步!
  • 相关阅读:
    awk 字符串函数
    C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
    Redis 命令总结
    个人网站和博客赚钱之路(转)
    二叉树的前序、中序、后序遍历与创建
    16个值得个人站长做的广告联盟[转自cnzz]
    mysql 添加[取消]timestamp的自动更新
    转:函数式编程初探
    可爱的 Python : Python中的函数式编程,第三部分
    可爱的 Python : Python中函数式编程,第二部分
  • 原文地址:https://www.cnblogs.com/lidaxia/p/4751329.html
Copyright © 2020-2023  润新知