iOS开发

iOS KVC运用

2020-04-08  本文已影响0人  神奇李白

主要应用场景

  1. KVC 属性赋值
  2. 添加和访问私有成员变量(ivar)
  3. 字典转模型
  4. 取值 模型转字典
  5. 集合操作符

自定义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"];
上一篇下一篇

猜你喜欢

热点阅读