在第一层字典转模型的基础上,只需要在字典转模型的方法中判断字典value 的类型和模型中属性名,如果value类型是字典,而且模型中属性名不包含NSDictionary, 那么说明字典中的这个值还是字典,而且模型中的这个值对应的类型也不是字典,那么就是自定义的模型了,具体代码如下:
其他代码不变,所以这里只给出字典转模型方法中的代码
+ (instancetype)modelWithDict:(NSDictionary *)dict{
id obj = [[self alloc] init];
unsigned int count = 0;
//1,取出属性列表
Ivar *ivarList = class_copyIvarList(self, &count);
//2,遍历属性列表,用kvc进行赋值
for(int i=0;i<count;i++){
//c语言是不用加*的,加*的都是地址
Ivar ivar = ivarList[i];//取出属性列表中的第i个属性
// ivar_getName(ivar);//属性名
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];//转换成OC字符串
NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];//获取模型中这个属性的类型
NSString *propName = [ivarName substringFromIndex:1];//去除第一个下划线
id value = dict[propName];
if ([value isKindOfClass:[NSDictionary class]]) {//检测字典中的某一个参数是不是也是字典类型,如果是,需要二次转换
//NSLog(@"%@", propName);
//如果字典中的属性还是字典,然后检测模型中该属性的类型是模型还是字典,如果是字典,说明不需要二次转换,直接转成字典即可,如果是模型,说明需要进行二次转换成二次模型
//NSLog(@"%@", ivarType);
//不包含NSDictionary字段,说明是自定义的模型类型
if (![ivarType containsString:@"NSDictionary"]) {
//二次转换
//获取模型类型
//注意:ivarType的结果是@"IMUserModel" ,需要截取掉其他符号
NSRange range = [ivarType rangeOfString:@"@\""];
NSString *typeString01 = [ivarType substringFromIndex:range.location + range.length];
NSString *typeStrFinal = [typeString01 substringToIndex:typeString01.length-1];
Class modelClass = NSClassFromString(typeStrFinal);
NSLog(@"%@",modelClass);
if (modelClass) {
value = [modelClass modelWithDict:value];
}
}
}
[obj setValue:value forKey:propName];//通过属性名取出字典中对应的值,并赋值到模型的属性上
}
//3,返回
return obj;
}