Objective-C
- Key Value Coding(键-值-编码)
-NSKeyValueCoding一个非正式的协议,提供一种机制来间接访问对象的属性。 - KVO 就是基于 KVC 实现的关键技术之一。
- 它是一种使用字符串标识符,间接访问对象属性的机制,而不是直接调用getter 和 setter方法。
- 通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法
注意: 使用KVC赋值和取值,key和属性名要保持一致,否侧会导致崩溃。
一、使用KVC
使用KVC对属性赋值,取值
People.h文件中
#import <Foundation/Foundation.h>
@interface People : NSObject{
NSString *name; //属性
}
@end
KVC使用
#pragma mark //////////KVC使用//////////
People *people = [[People alloc] init];
//使用KVC赋值
[people setValue:@"LuisX" forKey:@"name"];
//使用KVC取值
NSString *name = [people valueForKey:@"name"];
NSLog(@"%@", name);
//输出: LuisX
二、键路径访问
使用KVC对属性的属性赋值,取值
KVC在按照键值路径取值时,会自动层层深入,获取对应的键值
People.h文件中
#import <Foundation/Foundation.h>
#import "Address.h"
@interface People : NSObject{
NSString *name;
Address *address; //添加其他类属性
}
@end
Address.h文件中
#import <Foundation/Foundation.h>
@interface Address : NSObject{
NSString *code;
}
@end
键路径访问
#pragma mark //////////键路径访问//////////
People *people = [[People alloc] init];
[people setValue:@"LuisX" forKey:@"name"];
NSString *name = [people valueForKey:@"name"];
NSLog(@"%@", name);
//输出: LuisX
//方式一: 使用setValue...forKey赋值 valueForKeyPath取值
Address *address = [[Address alloc] init];
[address setValue:@"10010" forKey:@"code"];
[people setValue:address forKey:@"address"];
NSString *code1 = [people valueForKeyPath:@"address.code"];
NSLog(@"方式1:%@", code1);
//输出: 方式1:10010
//方式二: 使用setValue...forKeyPath赋值 valueForKeyPath取值
[people setValue:@"10010" forKeyPath:@"address.code"];
NSString *code2 = [people valueForKeyPath:@"address.code"];
NSLog(@"方式2:%@", code2);
//输出: 方式2:10010
三、自动封装基本数据类型
使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。
People.h文件中
#import <Foundation/Foundation.h>
#import "Address.h"
@interface People : NSObject{
NSString *name;
Address *address;
NSInteger number; //添加基本数据类型属性
}
@end
自动封装基本数据类型
#pragma mark //////////自动封装基本数据类型//////////
People *people = [[People alloc] init];
[people setValue:@"88" forKey:@"number"];
NSString *number = [people valueForKey:@"number"]; //NSInteger类型转字符串
NSLog(@"%@", number);
//输出: 88
四、操作集合
KVC按照键值路径取值时,如果对象不包含指定的键值,会自动进入对象内部,查找对象属性(例如数组内部)
People.h文件中
#import <Foundation/Foundation.h>
#import "Address.h"
@interface People : NSObject{
NSString *name;
Address *address;
NSInteger number;
NSArray *morePeople; //添加集合类型属性
}
@end
操作集合
#pragma mark //////////操作集合//////////
People *people = [[People alloc] init];
People *p1 = [[People alloc] init];
People *p2 = [[People alloc] init];
People *p3 = [[People alloc] init];
[p1 setValue:@"65" forKey:@"number"];
[p2 setValue:@"77" forKey:@"number"];
[p3 setValue:@"99" forKey:@"number"];
NSArray *array = [NSArray arrayWithObjects:p1, p2, p3, nil];
[people setValue:array forKey:@"morePeople"];
NSLog(@"数组中元素的number值:%@", [people valueForKeyPath:@"morePeople.number"]);
NSLog(@"元素个数:%@", [people valueForKeyPath:@"morePeople.@count"]);
NSLog(@"元素最大:%@", [people valueForKeyPath:@"morePeople.@max.number"]);
NSLog(@"元素最小:%@", [people valueForKeyPath:@"morePeople.@min.number"]);
NSLog(@"元素平均:%@", [people valueForKeyPath:@"morePeople.@avg.number"]);
//输出: 数组中元素的number值:(65, 77, 99)
//输出: 元素个数:3
//输出: 元素最大:99
//输出: 元素最小:65
//输出: 元素平均:80.333333333333333333333333333333333333