我是靠谱客的博主 火星上衬衫,这篇文章主要介绍经验之谈—KVC(forKey,forKeyPath),现在分享给大家,希望可以做个参考。

  • KVC是Cocoa一个大招,非常牛逼。
  • 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)
    如:Person.m文件中:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
@implementation Person { @private double _height; } - (void)printHeight { NSLog(@"height是%f", _height); } @end

Person.h中:

复制代码
1
- (void)printHeight;

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

复制代码
1
2
3
4
5
6
7
void test() { Person *p = [[Person alloc] init]; [p setValue:@10.5 forKey:@"height"]; [p printHeight]; }

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


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

复制代码
1
2
[p setValue:@"jack" forKey:@"name"]; [p setValue:@30 forKey:@"age"];
复制代码
1
2
[p setValue:@"jack" forKeyPath:@"_name"]; [p setValue:@30 forKeyPath:@"_age"];

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

  • 看一下若是层次结构深一点的。比如person 有dog;dog有bone
    这个是dog的属性:
复制代码
1
2
3
4
5
6
@class Bone; @interface Dog : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, strong) Bone *bone; @end

这个是bone的属性:

复制代码
1
2
3
@interface Bone : NSObject @property (nonatomic, strong) NSString *type; @end

我们先初始化这些对象:

复制代码
1
2
3
Person *p = [[Person alloc] init]; p.dog = [[Dog alloc] init]; p.dog.bone = [[Bone alloc] init];

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

复制代码
1
2
3
4
5
p.dog.bone.type = @"狗骨"; [p setValue:@"猪骨" forKeyPath:@"dog.bone.type"]; [p.dog setValue:@"猪骨" forKeyPath:@"bone.type"]; [p.dog.bone setValue:@"猪骨" forKeyPath:@"type"];
  • 从这里我们可以看出,这个forKeyPath的厉害,能使用点语法,深层次的去寻找我们需要的属性
  • 我们看一下取值的时候,forKeyPath:
复制代码
1
2
3
4
5
6
7
void test() { Person *p = [[Person alloc] init]; p.dog = [[Dog alloc] init]; p.dog.bone = [[Bone alloc] init]; }
  • 获得数组中的每一个元素的某个属性值

比如person有很多书:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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属性值,放到一个新的数组中返回

复制代码
1
NSArray *names = [p valueForKeyPath:@"books.name"];

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

复制代码
1
2
NSNumber *avgNumber = [p valueForKeyPath:@"books.@avg.price"]; NSNumber *sumNumber = [p valueForKeyPath:@"books.@sum.price"];

所以以后我们就用forKeyPath就行了。因为这个更强大。

最后

以上就是火星上衬衫最近收集整理的关于经验之谈—KVC(forKey,forKeyPath)的全部内容,更多相关经验之谈—KVC(forKey内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部