iOS开发探索-字典转模型(runtime实战)
2016-02-20 本文已影响1465人
零距离仰望星空
1. 字典转模型介绍
现在的ios开发中,我们通常会使用MVC模式。当我们拿到数据的时候,我们要把数据转成模型使用。
2. 字典转模型的好处:
(1)降低代码的耦合度
(2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率
(3)在程序中直接使用模型的属性操作,提高编码效率
(4)调用方不用关心模型内部的任何处理细节
3. 利用runtime实现转换:
通过动态获取属性列表,然后取出属性,由属性在数据字典获取值,然后在赋值给该模型属性。当对象的属性很少的时候,直接字典取出对应属性值简单赋值即可。
_属性 = dict["键"]
当对象的属性很多的时候,我们可以利用KVC批量设置。
setValuesForKeysWithDictionary:<#(NSDictionary *)#>
但是KVC批量转的时候,有个致命的缺点,就是当字典中的键,在对象属性中找不到对应的属性的时候会报错。
以下是笔者通过一个分类来实现字典转模型:
NSObject+Category.h 头文件
#import <Foundation/Foundation.h>
@interface NSObject (Category)
+ (instancetype)modelWithDict:(NSDictionary *)dict;
@end
NSObject+Category.m 文件
#import "NSObject+Category.h"
#import <objc/runtime.h>
@implementation NSObject (Category)
+ (NSArray *)propertList
{
unsigned int count = 0;
//获取模型属性, 返回值是所有属性的数组 objc_property_t
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
NSMutableArray *arr = [NSMutableArray array];
//便利数组
for (int i = 0; i< count; i++) {
//获取属性
objc_property_t property = propertyList[i];
//获取属性名称
const char *cName = property_getName(property);
NSString *name = [[NSString alloc]initWithUTF8String:cName];
//添加到数组中
[arr addObject:name];
}
//释放属性组
free(propertyList);
return arr.copy;
}
+ (instancetype)modelWithDict:(NSDictionary *)dict
{
id obj = [self new];
// 遍历属性数组
for (NSString *property in [self propertList]) {
// 判断字典中是否包含这个key
if (dict[property]) {
// 使用 KVC 赋值
[obj setValue:dict[property] forKey:property];
}
}
return obj;
}
@end
只需要将分类引入工程,再把NSObject+Category.h文件导入到模型类的.h文件中即可调用。
示例调用
示例模型 NSDictionary *dic = @{@"name":@"零距离仰望星空",
@"sex":@"男",
@"age":@25
};
Model *model = [Model modelWithDict:dic];
NSLog(@"name:%@ sex:%@ ",model.name,model.sex);
输出结果:
示例转换结果