zoukankan      html  css  js  c++  java
  • 利用runtime字典转模型

    目的:

      在日常开发中我们从字典中取出数据时,往往有可能会因为字典某一个key为关键字,或者我们自己改了,而模型里面可能一共有几十个属性,那么难道我们还要去一个个去写,那还不写到吐血。今天我就来分享如何使用runtime来把字典转换成模型.(这里字典里面是id,但是是关键字,所以模型里面我们是用的ID,所以需要转换)

    步骤

      1.首先依然是不要忘记导入头文件

    #import <objc/runtime.h>

      2.首先自定义一个类方法,用来字典转模型,传入参数要转换的字典,还一个就是用来存放被你修改的属性(这里的mapDict)

    + (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict

      3.利用传入的字典转换成模型具体步骤

        - 通过runtime获取当前类的所有属性

        - 利用字典取值,判断有没有值,因为是直接用字典取值,不会报错,如果是空证明没有这个key

        - 这时我们就直接用这个key去后面一个映射字典里面取,看看有没有映射的,这里面有,所以就这样从@“ID”转换成了@“id”

        - [objc setValue:value forKeyPath:ivarName] 成功给模型里面赋值

    + (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict
    {
        id objc = [[self alloc] init];
        
        
        // 遍历模型中属性
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList(self, &count);
        
        for (int i = 0 ; i < count; i++) {
            Ivar ivar = ivars[i];
            
            // 属性名称
            NSString *ivarName = @(ivar_getName(ivar));
            
            
            ivarName = [ivarName substringFromIndex:1];
            
            id value = dict[ivarName];
            // 需要由外界通知内部,模型中属性名对应字典里面的哪个key
            // ID -> id
            if (value == nil) {
                if (mapDict) {
                NSString *keyName = mapDict[ivarName];
                    
                value = dict[keyName];
                }
            }
        
                [objc setValue:value forKeyPath:ivarName];
               
        }
        return objc;
    }

      

  • 相关阅读:
    VS.NET提示"试图运行项目时出错:无法启动调试。绑定句柄无效"解决办法
    鼠标移动之hook学习
    今天完成任务之SQL中len的使用
    继承(2)方法《.NET 2.0面向对象编程揭秘 》
    框架设计:CLR Via C# 第二章
    启动IIS时提示“服务没有及时响应启动或控制请求”几种解决方法
    C#中处理字符串和数字
    TreeView实现权限管理
    鼠标单击右击双击简单功能的实现
    richTextBox 中插入图片
  • 原文地址:https://www.cnblogs.com/samyangldora/p/4621279.html
Copyright © 2011-2022 走看看