字典转模型
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;
}