字典转模型

作者: 丶爱少年时代 | 来源:发表于2016-10-31 20:27 被阅读17次

    上篇讲了怎么实现模型自动解归档的方法
    接下来讲一下怎么实现自动对复杂的字典进行转模型操作

    具体封装了两个方法

    1) 对字典进行转模型的方法

    ( 返回单个模型对象 )

    + (instancetype)ModelWithDic:(NSDictionary *)dic
    {
        id objc = [[self alloc] init];
        /*runtime: 根据模型中的属性,去字典中去除对应的value给模型属性赋值*/
        //*1.获取模型中所有属性 key
        unsigned int outCount;
        Ivar *ivarList = class_copyIvarList([self class], &outCount);
        //*2.通过成员列表名字去找 value
        for (int i = 0; i < outCount; i++) {
            NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivarList[i])];
            NSString *ivarType = [NSString stringWithUTF8String: ivar_getTypeEncoding(ivarList[i])];
            // @\"Model\" -> Model
            ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
            ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
            //3.去字典中去查找对应的value给模型属性赋值
            
            NSString *key = [ivarName substringFromIndex:1];
    
            id value = dic[key];
            //二级转换:判断value是否为字典,如果是则转换对应的模型
            //并且是自定义对象才转换
            if([value isKindOfClass:[NSDictionary class]] && ![ivarType hasPrefix:@"NS"])
            {
                Class modelClass = NSClassFromString(ivarType);
                value = [modelClass ModelWithDic:value];
            }
            /*判断value是否为数组,且属性名为模型类名,如果是则转换对应的模型数组*/
            if ([value isKindOfClass:[NSArray class]] && NSClassFromString([self toUpper:key])) {
    
                Class ModelClass = NSClassFromString([self toUpper:key]);
                value = [ModelClass ModelArrayWithArray:value];
            }
            if(value)
            {
                [objc setValue:value forKey:key];
            }
        }
        return objc;
    }
    

    2) 数组转模型的方法

    ( 返回装有model的数组 )

    + (NSArray *)ModelArrayWithArray:(NSArray *)array
    {
        NSMutableArray *arrM = [NSMutableArray array];
        for (NSDictionary *dic in array) {
            [arrM addObject:[self ModelWithDic:dic]];
        }
        return arrM;
    
    }
    

    当字典里包含了数组对象的时候,对成员变量进行判断,跳转到数组转换的方法里进行下一步的解析,用递归思想完成二级甚至多级转化,快速转换模型,希望在数据封装模型的时候省一些时间。

    具体用法参照demo:
    github : https://github.com/ChenZhiCN/CZModel

    注:抽出来首字母转大写的方法,可以忽略。。

    /*首字母转大写*/
    - (NSString *)toUpper:(NSString *)str1
    {
        NSString *str = [str1 copy];
        char temp = [str characterAtIndex:0] - 32;
        NSRange range = NSMakeRange(0, 1);
        str = [str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%c",temp]];
    
        return str;
    }
    
    

    相关文章

      网友评论

        本文标题:字典转模型

        本文链接:https://www.haomeiwen.com/subject/kyvputtx.html