KVC的使用

作者: 小白的天空 | 来源:发表于2019-07-26 15:38 被阅读40次

    小白的简书集合

    上篇已经介绍了KVC的调用机制,我们这篇将具体介绍下KVC的使用吧。

    我们可以将一个字典返回一个自定义的model,并且我们可以重定义字典的key

    @interface LWFKVCPersonModel : NSObject
    
    @property (nonatomic, assign) NSInteger userId;
    @property (nonatomic, assign) NSInteger age;
    @property (nonatomic, copy) NSString *name;
    
    @end
    
    @implementation LWFKVCPersonModel
    
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key {
      //字典中包含有“id”的特殊字符,这时候我们可以重定向指定为我们自己的属性
        if ([key isEqualToString:@"id"]) {
            self.userId = [value integerValue];
        }
    }
    
    - (NSString *)description {
        return [NSString stringWithFormat:@"userId:%ld, age:%ld, name:%@", self.userId, self.age, self.name];
    }
    
    @end
    
    
    - (void)test2 {
        NSDictionary *dictionary = @{@"id" : @"123", @"name" : @"lwf", @"age" : @"12"};
        LWFKVCPersonModel *model =  [[LWFKVCPersonModel alloc] init];
        [model setValuesForKeysWithDictionary:dictionary];
        NSLog(@"%@", model);
    }
    

    我们可以看到正确的打印出来我们所需要的属性


    D35E8281CDC4057AC844E458AE42DD08.jpg

    当我们对一个数组集合操作时:系统只会返回一个包含该属性的集合

        NSMutableArray *mutArr = [NSMutableArray array];
        for (NSInteger i = 0; i < 5; i++) {
            LWFKVCPersonModel *model = [LWFKVCPersonModel new];
            model.age = i;
            model.name = [NSString stringWithFormat:@"lwf_%ld", i];
            model.userId = i;
            [mutArr addObject:model];
        }
        NSLog(@"%@", [mutArr mutableArrayValueForKey:@"name"]);
    
    
    3D7DD6CFF10642AA733D556929664C6F.jpg

    当我们操作一个数组中没有该属性的时候,系统会自动停止改程序,并将保存之前的状态返回给我们

        [mutArr addObject:@"name"];
        id obj = [mutArr mutableArrayValueForKey:@"name"];
        NSLog(@"%@,%p,%@", obj, obj, [obj class]);
    
    C6F9A9280B719526F228B6DA822DBD43.jpg AADC7575FC4DCD87E6FAFAD112563DA1.jpg

    从图片中我们可以看出NSKeyValueSlowMutableArray是系统实现的一个私有的类,我们并不能去干预它,所以使用集合的时候要确保含有该属性,要不然我们只能空欢喜一场

    我们也看看KVC支持的运算符吧

        NSLog(@"sum:%@", [mutArr valueForKeyPath:@"@sum.age"]);
        NSLog(@"avg:%@", [mutArr valueForKeyPath:@"@avg.age"]);
        NSLog(@"min:%@", [mutArr valueForKeyPath:@"@min.age"]);
        NSLog(@"max:%@", [mutArr valueForKeyPath:@"@max.age"]);
        NSLog(@"count:%@", [mutArr valueForKeyPath:@"@count.age"]);
    
    B4462A06990F6BCB0785AC077983BA47.jpg

    最重要的是别忘了上篇我们所讲的KVC get时候的顺序哟:我们可以直接获取一个方法,就像这样:

    @interface LWFKVCPetModel : NSObject
    
    @end
    
    @implementation LWFKVCPetModel
    
    - (NSString *)description {
        return NSStringFromClass([self class]);
    }
    
    @end
    
       
    LWFKVCPetModel *petModel = [LWFKVCPetModel new];
    [mutArr addObject:petModel];    
    NSLog(@"%@", [mutArr valueForKeyPath:@"description"]);
    
    0DBC29E784354BEDF1DD2C95AAA20AC3.jpg
    至此,KVC的了解就差不多了吧,开始动工

    相关文章

      网友评论

        本文标题:KVC的使用

        本文链接:https://www.haomeiwen.com/subject/alkrrctx.html