经验之谈—KVC(forKey,forKeyPath)

40 篇文章 0 订阅
  • 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就行了。因为这个更强大。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值