利用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;
}

  

原文地址:https://www.cnblogs.com/samyangldora/p/4621279.html