字典轉(zhuǎn)模型一般都兩種方式,1、圖方便用的mj框架;2、自己在模型中寫(xiě)類(lèi)方法,用KVC實(shí)現(xiàn)。
換換口味,嘗試下runtime,如果想僅僅實(shí)現(xiàn)自己需要的功能其實(shí)很簡(jiǎn)單,就那幾個(gè)C語(yǔ)言函數(shù)
實(shí)現(xiàn)兩級(jí)嵌套字典的轉(zhuǎn)換:
#import <objc/message.h>
@implementation NSObject (Model)
+ (instancetype)modelWithDict:(NSDictionary *)dict{
// 1.創(chuàng)建對(duì)應(yīng)類(lèi)的對(duì)象
id objc = [[self alloc] init];
// runtime:遍歷模型中所有成員屬性,去字典中查找
// 屬性定義在哪,定義在類(lèi),類(lèi)里面有個(gè)屬性列表(數(shù)組)
unsigned int count = 0;
Ivar *ivarList = class_copyIvarList(self, &count);
for (int i = 0 ; i < count; i++) {
// 獲取成員屬性
Ivar ivar = ivarList[i];
// 獲取成員名
NSString *propertyName = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 獲取key(默認(rèn)是以下劃線開(kāi)頭的變量)
NSString *key = [propertyName substringFromIndex:1];
// 成員屬性類(lèi)型
NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
// user:NSDictionary
// 二級(jí)轉(zhuǎn)換
// 值是字典,成員屬性的類(lèi)型不是字典,才需要轉(zhuǎn)換成模型
if ([value isKindOfClass:[NSDictionary class]] && ![propertyType containsString:@"NS"]) { // 需要字典轉(zhuǎn)換成模型
// 轉(zhuǎn)換成哪個(gè)類(lèi)型(轉(zhuǎn)移符)
NSRange range = [propertyType rangeOfString:@"\""];
propertyType = [propertyType substringFromIndex:range.location + range.length];
range = [propertyType rangeOfString:@"\""];
propertyType = [propertyType substringToIndex:range.location];
// 獲取需要轉(zhuǎn)換類(lèi)的類(lèi)對(duì)象
Class modelClass = NSClassFromString(propertyType);
if (modelClass) {
value = [modelClass modelWithDict:value];
}
}
if (value) {
// KVC賦值:不能傳空
[objc setValue:value forKey:key];
}
}
return objc;
}
主要是 獲取對(duì)象的屬性列表: class_copyIvarList ,C語(yǔ)言字符串轉(zhuǎn)OC: ivar_getName,再通過(guò)操作字符串,最后賦值。