利用 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;
}
上一篇下一篇

猜你喜欢

热点阅读