利用 Runtime 实现字典转模型 下篇
2016-05-17 本文已影响32人
Young_Blood
实现二级字典转模型
+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary
{
// 创建 model
id objc = [[self alloc] init];
unsigned int count = 0;
Ivar *ivarList = class_copyIvarList(self, &count);
for (NSInteger i = 0; i < count; i++) {
Ivar ivar = ivarList[i];
// 获取成员名
NSString *propertyName = [NSString stringWithUTF8String:ivar_getName(ivar)];
// 成员属性类型
NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
// 获取 key
NSString *keyString = [propertyName substringFromIndex:1];
id value = dictionary[keyString];
if ([value isKindOfClass:[NSDictionary class]] && ![propertyType containsString:@"NS"]) {
// 字符串截取 @"@\"User\"" -> User\""
NSRange range = [propertyType rangeOfString:@"\""];
propertyType = [propertyType substringFromIndex:range.location + range.length];
// User\"" -> User
range = [propertyType rangeOfString:@"\""];
propertyType = [propertyType substringToIndex:range.location];
// 获取到转换的类
Class modelClass = NSClassFromString(propertyType);
if (modelClass) {
value = [modelClass modelWithDictionary:value];
}
}
if (value) {
[objc setValue:value forKey:keyString];
}
}
return objc;
}