一 KVC简介
KVC,即是指 NSKeyValueCoding,提供一种机制来间接访问对象的属性。常用于字典转模型,或者用于模型转字典,继承于NSObject 类,子类可用直接使用。
二 KVC赋值
//可以给当前对象属性赋值- (void)setValue:(id)value forKey:(NSString *)key;//可以给对象的属性的属性赋值(推荐使用)- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;//字典转对象- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
注意:
forKey只能给当前对象属性赋值。
例如:[self setVale:@"wlx" forkey:@"name"]。
forKeyPath 可以给对象的属性的属性赋值。
例如:[self setVale:@"thinkpad" forkeypath:@"person.computer"]。
二 字典转模型
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
注意:要求字典中的key 和对象属性要求一样
三 模型转字典
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;//实例:NSDictionary *dic = [self.dataArray dictionaryWithValuesForKeys:@[@"name",@"age"]];for (int i =0 ; i
四 KVC取值
//只能获取对象属性的值- (id)valueForKey:(NSString *)key;//可以获取对象属性的属性的值(推荐使用)- (id)valueForKeyPath:(NSString *)keyPath;
五 KVC运算
KVC 可用进行简单的运算,例如 sum avg min 的运算。
[array valueForKeyPath:@"@sum.age"];
NSLog(@"sum=%@",[self.dataArray valueForKeyPath:@"@sum.age"]);NSLog(@"avg=%@",[self.dataArray valueForKeyPath:@"@avg.age"]);NSLog(@"min=%@",[self.dataArray valueForKeyPath:@"@min.age"]);
六 注意事项
KVC需要把字符串属性名称转换后才能赋值,调用的set方法,性能消耗较高
七 代码
7.1 ViewController
#import "ViewController.h"#import "Cat.h"#import "Person.h"@interface ViewController ()@property (nonatomic,strong) NSArray *dataArray;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; /** KVC 测试 **/ //1.KVC 设置Cat 值 NSLog(@"=====KVC 设置Cat 值 字段转模型===="); for (int i=0; i
7.2Cat类
===cat.h===@interface Cat : NSObject/** * 年龄 */@property (nonatomic,assign)NSInteger age;/** * 名字 */@property (nonatomic,copy)NSString *name;/** * 构造方法 * * @param dic <#dic description#> * * @return <#return value description#> */-(instancetype)initWithDic:(NSDictionary *)dic;+(instancetype)catWithDic:(NSDictionary *)dic;@end===cat.m===#import#import "Cat.h"@implementation Cat-(instancetype)initWithDic:(NSDictionary *)dic{ if (self = [super init]) { /** KVC 字典转模型 **/ //1 通过 setValue 方法 //[self setValue:dic[@"name"] forKey:@"name"]; //[self setValue:dic[@"age"] forKeyPath:@"age"]; //2 字典转模型 [self setValuesForKeysWithDictionary:dic]; } return self;}+(instancetype)catWithDic:(NSDictionary *)dic{ return [[self alloc]initWithDic:dic];}@end
7.3 person类
===person.h===#import "Cat.h"@interface Person : NSObject/** * 名字 */@property (nonatomic,copy)NSString *name;/** * 拥有的猫 */@property (nonatomic,strong)Cat *cat;@end===person.m===#import#import "Person.h"@implementation Person@end
7.4 输出
2014-12-29 00:42:03.814 22KVC测试[2484:149139] =====KVC 设置Cat 值 字段转模型====2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat12014-12-29 00:42:03.815 22KVC测试[2484:149139] cat22014-12-29 00:42:03.815 22KVC测试[2484:149139] cat32014-12-29 00:42:03.816 22KVC测试[2484:149139] =====forKey forKeyPath valueForKey valueForKeyPath 区别 ====2014-12-29 00:42:03.816 22KVC测试[2484:149139] 卧龙小 - cat42014-12-29 00:42:03.816 22KVC测试[2484:149139] =====模型转字典 ====2014-12-29 00:42:03.816 22KVC测试[2484:149139] ( cat1, cat2, cat3)2014-12-29 00:42:03.816 22KVC测试[2484:149139] ( 5, 7, 5)2014-12-29 00:42:03.816 22KVC测试[2484:149139] =====kvc运算====2014-12-29 00:42:03.816 22KVC测试[2484:149139] sum=172014-12-29 00:42:03.817 22KVC测试[2484:149139] avg=5.66666666666666666666666666666666666662014-12-29 00:42:03.817 22KVC测试[2484:149139] min=5