zoukankan      html  css  js  c++  java
  • 字典转模型KVC和runtime二者实现与区别

           我们知道在开发中,字典转模型是一种很常用的设计模式,当字典中元素的个数比较少的时候,我们可以直接用dic[key]去给模型对象的属性赋值,但是当字典中元素的个数比较多的时候,再用前面的解决方法就不行了,所以就有了KVC(key value coding:键值编码)字典转模型的设计模式。

    KVC的设计原理:

    [item setValue:@"value" forKey:@"property"]:

    1.首先去模型中查找有没有setProperty,找到,直接调用赋值 [self setProperty:@"value"]

    2.去模型中查找有没有property属性,有,直接访问属性赋值  property = value

    3.去模型中查找有没有_property属性,有,直接访问属性赋值 _property = value

    4.找不到,就会直接报错 setValue:forUndefinedKey:报找不到的错误

    但是我们常用的KVC去实现有三个条件:

    1.必须保证模型中定义的属性要大于或等于字典中key的数量。

    2.模型中的基本数据类型无法进行转换。

    3.属性的名字必须和键相同,否则找不到相关属性会报错

        KVC的实现模式是取出字典中的键值,去模型中找与之对应的属性,那么反之考虑,我们能不能抓取模型中的属性对象,去字典中找对应的键值呢?所以这就要考虑用到运行时机制runtime了。我们先获取到模型对象的属性名,将他们加入到一个数组当中,然后遍历数组,在遍历过程中给属性对象赋值。这也是KVC和runtime用于实现字典转模型的区别之一。下面我们就用代码实现下runtime下的字典转模型实现:


     

    在model的分类中去实现以下方法


     

    这个地方涉及到一个二级转换的问题,就是去字典中查找对应的Value的时候,value值可能又是一个字典,那么需要将其再次进行模型转换,代码实现如下:

    二级转换:判断下value是否是字典,如果是,字典转换层对应的模型

    // 并且是自定义对象才需要转换

    if ([value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"]) {

    // 转换成哪个模型

    // 获取类

    Class modelClass = NSClassFromString(ivarType);

    value = [modelClass modelWithDict:value];

    }



    文/阿熊不是阿雄(简书作者)
    原文链接:http://www.jianshu.com/p/df1de1784b6d
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    Java初学者笔记四:按行读写文件和输入处理
    Java初学者笔记三:关于字符串和自实现数组常见操作以及异常处理
    Java初学者笔记二:关于类的常见知识点汇总
    python的类继承与派生
    Java初学者笔记一:元类、获取类型、枚举
    Tomcat远程任意代码执行漏洞及其POC(CVE-2017-12617)
    PostgreSQL远程代码执行漏洞(CVE-2018-1058)学习笔记
    python的三个函数(eval、exec、complie)和python版RMI
    关于Memcached反射型DRDoS攻击分析
    python的其他安全隐患
  • 原文地址:https://www.cnblogs.com/iOSJason/p/5559624.html
Copyright © 2011-2022 走看看