zoukankan      html  css  js  c++  java
  • 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就行了。因为这个更强大。 
  • 相关阅读:
    莫比乌斯反演套路一--令t=pd--BZOJ2820: YY的GCD
    BZOJ2720: [Violet 5]列队春游
    BZOJ2277: [Poi2011]Strongbox
    莫(meng)比(bi)乌斯反演--BZOJ2301: [HAOI2011]Problem b
    「CodePlus 2017 11 月赛」Yazid 的新生舞会
    「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
    用NumGo实现安卓动画
    人生
    用NumGo实现安卓动画
    html5使用canvas绘制n角星
  • 原文地址:https://www.cnblogs.com/xsyl/p/6085913.html
Copyright © 2011-2022 走看看