CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

利用Runtime给模型自动增加 字典转对象方法


1. 字典转模型介绍

现在的ios开发中,我们通常会使用MVC模式。当我们拿到数据的时候,我们要把数据转成模型使用。

2. 字典转模型的好处:

(1)降低代码的耦合度
(2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率
(3)在程序中直接使用模型的属性操作,提高编码效率
(4)调用方不用关心模型内部的任何处理细节

3. 利用runtime实现转换:

通过动态获取属性列表,然后取出属性,由属性在数据字典获取值,然后在赋值给该模型属性。当对象的属性很少的时候,直接字典取出对应属性值简单赋值即可。


_属性 = dict["键"]
当对象的属性很多的时候,我们可以利用KVC批量设置。
setValuesForKeysWithDictionary:<#(NSDictionary *)#>
但是KVC批量转的时候,有个致命的缺点,就是当字典中的键,在对象属性中找不到对应的属性的时候会报错。

NSObject+Category.h 头文件

//
//  NSObject+Category.h
//  B05.进度圈
//
//  Created by bear on 16/4/19.
//  Copyright ©bear 2016年 
. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (Category)

+ (instancetype)modelWithDict:(NSDictionary *)dict;

@end

NSObject+Category.m实现



//
//  NSObject+Category.m
//  B05.进度圈
//
//  Created by bear on 16/4/19.
//  Copyright ©bear2016年

. All rights reserved.
//
#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文件中即可调用。


点击下载:NSObject+Category.zip



添加新评论