iOS日常知识储备iOS开发笔录iOS Developer

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);

输出结果:


示例转换结果

在此感谢各位读者的来访,您的关注是我写作分享的最大动力。

上一篇下一篇

猜你喜欢

热点阅读