KVC

来源:互联网 发布:java split多个分隔符 编辑:程序博客网 时间:2024/06/16 21:39

KVC

1.1.基本概念

1.1.1.KVC 是 KeyValue Coding 的简称,它是一种可以直接通过字符串的名字( key ) 来访问类属性的机制。

1.1.2.使用该机制不需要调用存取方法和变量实例就可访问对象属性。

1.1.3.本质上讲,键-值编码定义了你的程序存取方法需要实现的样式及方法签名。

1.1.4.在应用程序中实现键-值编码兼容性是一项重要的设计原则。存取方法可以加强合适的数据封装,而键-值编码方法在多数情况下可简化程序代码。

1.1.5.键-值 编码方法在 Objective-C 非标准协议(类目) NSKeyValueCoding 中 被声明,默认的实现方法由  NSObject 提供。

1.1.6.键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。

1.1.7.使用 KVC 为对象赋值或者取值时,需要知道准确的键值, 相比较点语法,KVC 是一种间接的传递方式,这种方式有利于对象解耦,让对象彼此之间的耦合度不会太高。

1.2.设置和访问

1.2.1.键/值编码中的基本调用包括 -valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息,字符串为属性名,即键:

1

2

3

4

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

NSMutableString*name = [[NSMutableStringalloc] initWithFormat:@"jack"];

[jack setValue:name forKey:@"name"];//通过KVC设值

NSLog(@"Jack's name : %@", [jack valueForKey:@"name"]);//通过KVC取值

1.2.2.是否存在 setter、getter 方法, 若存在优先调用相应方法;若不存在,它将在内部查找名为 _key 或 key 的实例变量。

1.2.3.通过 KVC 设置对象,此对象会 retain。

1.2.4.通过 setValue:forKey: 设置对象的值,或通过 valueForKey 来获取对象的值时,如若对象的实例变量为基本数据类型时 ( char、int、float、BOOL ) ,我们需要对数据进行封装。

1.2.5.赋值语句 setValue:forKey: 是给对象当前的属性赋值,而 setValue:forKeyPath: 是按照对象的层级关系为其中的属性赋值

。 forKeyPath可以替代forKey,但是forKey不能替代forKeyPath。

1.2.6.setValuesForKeysWithDictionary:  可以从 plist 文件中读取对应的数据字典,对对象属性赋值。

1.3.批处理

1

2

3

4

5

6

7

8

//同时获取 Student 的 age 和 name

NSArray *keys = [NSArrayarrayWithObjects:@"name",@"age", nil];

NSDictionary*dict = [student dictionaryWithValuesForKeys:keys];

//同时设置 Student 的 age 和 name

NSArray *keys = [NSArrayarrayWithObjects:@"name",@"age", nil];

NSArray *values = [NSArrayarrayWithObjects:@"MJ", [NSNumbernumberWithInt:16], nil];

NSDictionary*dict = [NSDictionarydictionaryWithObjects:values forKeys:keys];

[student setValuesForKeysWithDictionary:dict];

1.4.路径

除了通过键设值或取值外, 键/值编码还支持指定路径设值或取值,像文件系统一样, 用“ . ”号隔开:

1

[book setValue:@"比尔"forKeyPath:@"author.name"];

1

NSNumber *price=[book valueForKeyPath:@"relativeBooks.price"]

1.4.数组的整体操作

如果向 NSArray 请求一个键值,它实际上会查询数组中的每个对象来查找这个键值, 然后将查询结果打包到另一个数组中并返回给你:

1

2

3

4

// 获取 Student 中所有 Book 的 name

NSArray *names = [student.books valueForKeyPath:@"name"]; 或者

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

//注意:不能在键路径中为数组添加索引,比如 @"books[0].name"

1.5.KVC的简单运算

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

//count

NSString *count = [book valueForKeyPath:@"relativeBooks.@count"];

NSLog(@"count : %@", count);

//sum

NSString *sum = [book valueForKeyPath:@"relativeBooks.@sum._price"];

NSLog(@"sum : %@", sum);

//avg

NSString *avg = [book valueForKeyPath:@"relativeBooks.@avg._price"];

NSLog(@"avg : %@", avg);

//min

NSString *min = [book valueForKeyPath:@"relativeBooks.@min._price"];

NSLog(@"min : %@", min);

//max

NSString *max = [book valueForKeyPath:@"relativeBooks.@max._price"];

NSLog(@"max : %@", max);

1 0
原创粉丝点击