目的:
在日常开发中我们从字典中取出数据时,往往有可能会因为字典某一个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; }
时间: 2024-10-09 15:50:05