为什么80%的码农都做不了架构师?>>>
一 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] cat1
2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat2
2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat3
2014-12-29 00:42:03.816 22KVC测试[2484:149139] =====forKey forKeyPath valueForKey valueForKeyPath 区别 ====
2014-12-29 00:42:03.816 22KVC测试[2484:149139] 卧龙小 - cat4
2014-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=17
2014-12-29 00:42:03.817 22KVC测试[2484:149139] avg=5.6666666666666666666666666666666666666
2014-12-29 00:42:03.817 22KVC测试[2484:149139] min=5