美文网首页程序员
iOS之KVC字典转模型的底层实现

iOS之KVC字典转模型的底层实现

作者: 李小南 | 来源:发表于2016-03-27 22:19 被阅读923次

KVC: Key Value Coding (键值编码)

在iOS开发中,KVC是我们经常要使用的技术.那么KVC有什么作用呢?简单列举一下下面几种:

  • 取值和赋值(开发中基本不用)
  • 获取对象私有变量的值.(经常使用,例如UIPageContorl分页, 设置圆点为图片)
  • 改变对象私有变量的值(经常使用)
  • 简单的字典转模型(偶尔使用)
  • 模型转字典
  • 批量取值

KVC字典转模型的底层实现

  • 通常我们手动将字典转模型的话,会在模型中提供一个类方法接收一个字典,在这个方法中将字典转换成模型,再将转换好的模型返回.
 + (instancetype)statusWithDict:(NSDictionary *)dict
{
    Status *status = [[self alloc] init];
    //利用KVC字典转模型
    [status setValuesForKeysWithDictionary:dict];
    
    return status;
}
  • 分析一下[status setValuesForKeysWithDictionary:dict]的底层实现原理
 + (instancetype)statusWithDict:(NSDictionary *)dict
{
    Status *status = [[self alloc] init];
    //利用KVC字典转模型
    //[status setValuesForKeysWithDictionary:dict];
      
    //setValuesForKeysWithDictionary:原理--遍历字典中所有的key,去模型中查找对应的属性,把值给模型属性赋值
    
    [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        // 这行代码才是真正给模型的属性赋值
        [status setValue:obj forKey:key];
    }];
    return status;
}
  • KVC字典转模型弊端:必须保证,模型中的属性和字典中的key一一对应。如果不是一一对应的话,就会报错,仔细看一下错误信息,[<Status 0x7fd439d20a60> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key source.是系统调用了setValue:forUndefinedKey:报错.如果想解决这个问题,只需要在模型中重写对象的setValue:forUndefinedKey:,把系统的方法覆盖, 就能继续使用KVC,字典转模型了。
 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
}

啰嗦一点KVC的setValue:forKey:方法赋值的原理

  • 首先会去模型中查找有没有对应key的setter方法,有就直接调用set方法方法赋值.
  • 上一步没有的话,去模型中查找有没有和key同名的属性,有的话赋值给与key同名的属性.
  • 上一步还没有的话,去属性中查找有没有和key同名的带下划线的属性,有的话直接赋值.
  • 如果再没有,那就直接调用对象的 setValue:forUndefinedKey:直接报错

相关文章

  • iOS之KVC字典转模型的底层实现

    KVC: Key Value Coding (键值编码) 在iOS开发中,KVC是我们经常要使用的技术.那么KVC...

  • 14-Swift中字典转模型

    字典转模型(初始化时传入字典) 字典转模型(利用KVC转化) 一、 普通的字典转模型: 二、利用KVC字典转模型:

  • iOS 字典转模型KVC实现

    字典转模型 KVC 实现 KVC 字典转模型弊端:必须保证,模型中的属性和字典中的key一一对应。 如果不一致,就...

  • KVC的简单使用

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

  • iOS 字典转模型 KVC实现

    1. Student模型定义如下 在Student.h中 在Student.m中 2. 给Student模型赋值 ...

  • KVC字典转模型底层实现原理

    遍历字典里面所有的key key:name就去模型中查找有没有setName:,直接调用这个对象setName:赋...

  • KVC底层实现和应用

    一、KVC字典转模型的实现原理 假设dict字典中有name,icon的Key,CYXModel模型类中必须要有同...

  • 字典转模型之KVC和MJExtension底层的实现

    一 快速生成@property 1 当我们需要用模型去实现一个比较小的功能的时候,由于我们需要对plist文件进行...

  • 字典转模型(二) --学习MJExtension

    字典转模型方法实现(利用kvc可快速实现) 但是有时字典一些属性我们不需要时, 即我们模型的属性与字典的key不一...

  • iOS KVC:字典转模型

    参考 iOS开发·KVC:字典转模型,防止因本地未定义字段(后台的字段与本地字符串名不一致)导致数据转换过程中的奔...

网友评论

    本文标题:iOS之KVC字典转模型的底层实现

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