首页投稿(暂停使用,暂停投稿)

字典转模型

2016-10-31  本文已影响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;
}

上一篇下一篇

猜你喜欢

热点阅读