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详解

    KVC 目录结构KVC定义KVC取值和设置KVC使用keyPathKVC处理字典KVC作用 参考:iOS KVC和...

  • iOS原理篇(二): KVC实现原理

    KVC实现原理 什么是 KVC KVC基本使用 KVC 原理 总结 一 、 什么是KVC KVC的全称是Key-V...

  • 数据存储

    1.1.3.使用通知传值 1.2.Segue使用 2. KVC&&KVO2.1.什么是KVC KVC - Key ...

  • OC语法:KVC的底层实现

    一、KVC是什么二、怎么使用KVC三、KVC的底层实现四、KVC常见面试题 一、KVC是什么 KVC全称Key-V...

  • KVC

    方法交换 KVC的使用 KVC的原理 KVC自定义 参考资料 DIS_KVC_KVO[https://github...

  • KVC的简单使用

    KVC字典转模型 KVC 中经常使用的就是字典转模型 KVC的大招 KVC设置对象属性及取值 KVC间接设置对象属...

  • 02-03、图片的拉伸、KVC和KVO的使用

    1、图片拉伸 2、KVC的使用 KVC: Key Value Coding(键值编码) 3、KVO的使用 KVO:...

  • KVC,KVO

    主要分成一下几个部分1.KVC1.1 KVC简介1.2 KVC使用2.KVO2.1 KVO简介2.2 KVO使用 ...

  • KVO和KVC的使用及原理解析

    一 KVO基本使用 二 KVO本质原理讲解及代码验证 三 KVC基本使用 四 KVC设值原理 五 KVC取值原理 ...

  • 03--KVC/KVO本质04--KVC 注意事项

    总结 KVC 使用的一些注意事项 KVC 注意事项 KVC 自动转换类型使用string存基本类型,系统会存为 _...

网友评论

    本文标题:KVC的使用

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