在第一層字典轉(zhuǎn)模型的基礎(chǔ)上帮寻,只需要在字典轉(zhuǎn)模型的方法中判斷字典value 的類型和模型中屬性名乍狐,如果value類型是字典,而且模型中屬性名不包含NSDictionary固逗, 那么說(shuō)明字典中的這個(gè)值還是字典浅蚪,而且模型中的這個(gè)值對(duì)應(yīng)的類型也不是字典,那么就是自定義的模型了烫罩,具體代碼如下:
其他代碼不變惜傲,所以這里只給出字典轉(zhuǎn)模型方法中的代碼
+ (instancetype)modelWithDict:(NSDictionary *)dict{
id obj = [[self alloc] init];
unsigned int count = 0;
//1,取出屬性列表
Ivar *ivarList = class_copyIvarList(self, &count);
//2贝攒,遍歷屬性列表盗誊,用kvc進(jìn)行賦值
for(int i=0;i<count;i++){
//c語(yǔ)言是不用加*的,加*的都是地址
Ivar ivar = ivarList[i];//取出屬性列表中的第i個(gè)屬性
// ivar_getName(ivar);//屬性名
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];//轉(zhuǎn)換成OC字符串
NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];//獲取模型中這個(gè)屬性的類型
NSString *propName = [ivarName substringFromIndex:1];//去除第一個(gè)下劃線
id value = dict[propName];
if ([value isKindOfClass:[NSDictionary class]]) {//檢測(cè)字典中的某一個(gè)參數(shù)是不是也是字典類型隘弊,如果是哈踱,需要二次轉(zhuǎn)換
//NSLog(@"%@", propName);
//如果字典中的屬性還是字典,然后檢測(cè)模型中該屬性的類型是模型還是字典梨熙,如果是字典开镣,說(shuō)明不需要二次轉(zhuǎn)換,直接轉(zhuǎn)成字典即可咽扇,如果是模型邪财,說(shuō)明需要進(jìn)行二次轉(zhuǎn)換成二次模型
//NSLog(@"%@", ivarType);
//不包含NSDictionary字段,說(shuō)明是自定義的模型類型
if (![ivarType containsString:@"NSDictionary"]) {
//二次轉(zhuǎn)換
//獲取模型類型
//注意:ivarType的結(jié)果是@"IMUserModel" 质欲,需要截取掉其他符號(hào)
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];//通過(guò)屬性名取出字典中對(duì)應(yīng)的值树埠,并賦值到模型的屬性上
}
//3,返回
return obj;
}