• KVC(forKey,forKeyPath)


    • KVC是Cocoa一个大招,非常牛逼。
    • 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 
      如:Person.m文件中:
    @implementation Person
    {
        @private
        double _height;
    }

    - (void)printHeight
    {
        NSLog(@"height是%f", _height);
    }
    @end
     

    Person.h中:

    - (void)printHeight;
     

    看我们如何修改这个height的值:

    void test()
    {
        Person *p = [[Person alloc] init];

        [p setValue:@10.5 forKey:@"height"];
        [p printHeight];
    }
     

    就这样就能更改了这个height的值。


    forKeyPath中可以利用.运算符, 就可以一层一层往下查找对象的属性 
    当然 在一般的修改一个对象的属性的时候,forKey和forKeyPath,没什么区别。如:

                [p setValue:@"jack" forKey:@"name"];
                [p setValue:@30 forKey:@"age"];
     
                [p setValue:@"jack" forKeyPath:@"_name"];
                [p setValue:@30 forKeyPath:@"_age"];
     

    一样能修改这个name和age的值。

    • 看一下若是层次结构深一点的。比如person 有dog;dog有bone 
      这个是dog的属性:
    @class Bone;

    @interface Dog : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, strong) Bone *bone;
    @end
     

    这个是bone的属性:

    @interface Bone : NSObject
    @property (nonatomic, strong) NSString *type;
    @end
     

    我们先初始化这些对象:

        Person *p = [[Person alloc] init];
        p.dog = [[Dog alloc] init];
        p.dog.bone = [[Bone alloc] init];
     

    然后接下来我们给这个bone赋值:

                p.dog.bone.type = @"狗骨";

                [p setValue:@"猪骨" forKeyPath:@"dog.bone.type"];
                [p.dog setValue:@"猪骨" forKeyPath:@"bone.type"];
        [p.dog.bone setValue:@"猪骨" forKeyPath:@"type"];
     
    • 从这里我们可以看出,这个forKeyPath的厉害,能使用点语法,深层次的去寻找我们需要的属性
    • 我们看一下取值的时候,forKeyPath:
    void test()
    {
        Person *p = [[Person alloc] init];
        p.dog = [[Dog alloc] init];
        p.dog.bone = [[Bone alloc] init];

    }
     
    • 获得数组中的每一个元素的某个属性值

    比如person有很多书:

     Person *p = [[Person alloc] init];

            Book *book1 = [[Book alloc] init];
            book1.name = @"ios之Ui布局";
            book1.price = 10.5;

            Book *book2 = [[Book alloc] init];
            book2.name = @"ios之OC基础";
            book2.price = 18.5;

            Book *book3 = [[Book alloc] init];
            book3.name = @"ios之多线程";
            book3.price = 20.5;

            Book *book4 = [[Book alloc] init];
            book4.name = @"ios之内存管理";
            book4.price = 10.5;

            p.books = @[book1, book2, book3, book4];
     

    然后我们取出books数组中每一个元素的name属性值,放到一个新的数组中返回

            NSArray *names = [p valueForKeyPath:@"books.name"];
     

    这样就能办到。 
    还有一个比较牛逼的 是取得一些特殊的值,如:avg、sum

            NSNumber *avgNumber = [p valueForKeyPath:@"books.@avg.price"];
            NSNumber *sumNumber = [p valueForKeyPath:@"books.@sum.price"];
     
     
    所以以后我们就用forKeyPath就行了。因为这个更强大。 
  • 相关阅读:
    post请求返回404
    启动网关服务报错 Unable to find GatewayFilterFactory with name RequestRateLimiter
    数据库远程连接linux报错2003 can't connect to MySQL server on ip (0) 防火墙没有开放端口3306
    idea下maven项目打包部署到tomcat服务器
    修改Idea背景色
    20种源代码测试工具
    作为一名测试工程师,需要具备哪些能力
    Android自动化测试工具——monkey简介及入门
    appium关于定位元素
    appium testcase2
  • 原文地址:https://www.cnblogs.com/xsyl/p/6085913.html
Copyright © 2020-2023  润新知