主要應(yīng)用場(chǎng)景
- KVC 屬性賦值
- 添加和訪問(wèn)私有成員變量(ivar)
- 字典轉(zhuǎn)模型
- 取值 模型轉(zhuǎn)字典
- 集合操作符
自定義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;
簡(jiǎn)單屬性賦值
Person *p = [[Person alloc]init];
[p setValue:@"小李" forKey:@"name"];
[p setValue:@"杭州" forKey:@"address"];
復(fù)雜屬性賦值 (自定義類)
Person *p = [[Person alloc]init];
p.dog = [[Dog alloc]init];
[p setValue:@"小李" forKey:@"name"];
[p setValue:@"宜賓" forKey:@"address"];
//p的屬性中有一個(gè)是自定義的Dog類来屠,給自定義類賦值的方法有兩種:
//方法1:
[p setValue:@"喵喵桑" forKeyPath:@"dog.name"];
//方法2
[p.dog setValue:@"10歲" forKeyPath:@"age"];
添加和訪問(wèn)私有成員變量
//假如Person類的.m文件中有一個(gè)私有成員變量age
Person *p = [[Person alloc]init];
//賦值
[p setValue:@"26" forKeyPath:@"_age"];
//取值
NSString *age = [p valueForKeyPath:@"_age"];
復(fù)雜的字典轉(zhuǎn)模型
/*
KVC,使用setValuesForKeysWithDictionary:方法,該方法默認(rèn)根據(jù)字典中每個(gè)鍵值對(duì),調(diào)用setValue:forKey方法
缺點(diǎn):字典中的鍵值對(duì)必須與模型中的鍵值對(duì)完全對(duì)應(yīng),否則程序會(huì)崩潰
*/
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"]];
//保存模型的可變數(shù)組
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 返回一個(gè)值為集合中對(duì)象總數(shù)的NSNumber對(duì)象;
@avg 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其平均值,并返回這個(gè)平均值的NSNumber對(duì)象;
@max 使用compare:方法來(lái)確定最大值,并返回最大值的NSNumber對(duì)象.所以為了保證其正常比較,集合中所有的對(duì)象都必須支持和另一個(gè)對(duì)象的比較,保證其可比性;
@min 原理和@max一樣,其返回的是集合中的最小值的NSNumber對(duì)象;
@sum 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其總和,并返回總和的NSNumber對(duì)象;
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"];