OC运行时06-二级字典转模型

  • 在第一层字典转模型的基础上,只需要在字典转模型的方法中判断字典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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容