iOS KVC运用
2020-04-08 本文已影响0人
神奇李白
主要应用场景
- KVC 属性赋值
- 添加和访问私有成员变量(ivar)
- 字典转模型
- 取值 模型转字典
- 集合操作符
自定义Person
@property (strong , nonatomic) NSString *name;
@property (strong , nonatomic) NSString *address;
@property (strong , nonatomic) Dog *dog;
@property (strong , nonatomic) NSArray<Book * > *books;
@property (assign , nonatomic) CGFloat numer;
简单属性赋值
Person *p = [[Person alloc]init];
[p setValue:@"小李" forKey:@"name"];
[p setValue:@"杭州" forKey:@"address"];
复杂属性赋值 (自定义类)
Person *p = [[Person alloc]init];
p.dog = [[Dog alloc]init];
[p setValue:@"小李" forKey:@"name"];
[p setValue:@"宜宾" forKey:@"address"];
//p的属性中有一个是自定义的Dog类,给自定义类赋值的方法有两种:
//方法1:
[p setValue:@"喵喵桑" forKeyPath:@"dog.name"];
//方法2
[p.dog setValue:@"10岁" forKeyPath:@"age"];
添加和访问私有成员变量
//假如Person类的.m文件中有一个私有成员变量age
Person *p = [[Person alloc]init];
//赋值
[p setValue:@"26" forKeyPath:@"_age"];
//取值
NSString *age = [p valueForKeyPath:@"_age"];
复杂的字典转模型
/*
KVC,使用setValuesForKeysWithDictionary:方法,该方法默认根据字典中每个键值对,调用setValue:forKey方法
缺点:字典中的键值对必须与模型中的键值对完全对应,否则程序会崩溃
*/
NSDictionary *dic = @{@"name":@"老李",
@"address":@"宜宾",
@"dog":@{@"name":@"喵喵桑",@"other":@"很肥"},
@"books":@[
@{
@"name" : @"python从入门到放弃",
@"price" : @"12.3"},
@{
@"name" : @"一本书",
@"price" : @"20.5"
}]
};
Person *p = [[Person alloc]init];
p.dog = [[Dog alloc]init];
[p.dog setValuesForKeysWithDictionary:dic[@"dog"]];
//保存模型的可变数组
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dict in dic[@"books"]) {
Book *book = [[Book alloc]init];
[book setValuesForKeysWithDictionary:dict];
[array addObject:book];
}
p.books = array;
集合操作符
以前百度的:
@count 返回一个值为集合中对象总数的NSNumber对象;
@avg 首先把集合中的每个对象都转换为double类型,然后计算其平均值,并返回这个平均值的NSNumber对象;
@max 使用compare:方法来确定最大值,并返回最大值的NSNumber对象.所以为了保证其正常比较,集合中所有的对象都必须支持和另一个对象的比较,保证其可比性;
@min 原理和@max一样,其返回的是集合中的最小值的NSNumber对象;
@sum 首先把集合中的每个对象都转换为double类型,然后计算其总和,并返回总和的NSNumber对象;
Person *p0 = [[Person alloc]init];
p0.name = @"小李";
p0.numer = 12;
Person *p1 = [[Person alloc]init];
p1.name = @"小王";
p1.numer= 20;
Person *p2 = [[Person alloc]init];
p2.name = @"小六";
p2.numer = 31;
NSArray *array = @[p0,p1,p2];
NSNumber *countNumber = [array valueForKeyPath:@"count.name"];
NSNumber *avgNumber = [array valueForKeyPath:@"avg.numer"];