美文网首页
Runtime(七)字典转模型

Runtime(七)字典转模型

作者: 炒河粉儿 | 来源:发表于2019-08-16 11:27 被阅读0次

前言

有很多优秀的第三方框架实现序列化和反序列化的功能。我们可以通过集成这些框架,便捷的实现字典与模型之间的相互转换。例如MJExtension,YYModel。思考一下如何利用runtime的思想去便捷的实现模型和字典的相互转化。

思考

通常字典和模型的key需要一一对应,一个个的赋值模型属性是一个很繁琐的事情,可以不可以自动根据一个字典,自动赋值到对应的属性上。

如果直接简单的使用KVC赋值的方式虽然一句代码就可以搞定。

[person setValuesForKeysWithDictionary:dict];

但是这样的弊端是在太明显,如果模型中的属性和字典的key不是一一对应的,就会出现崩溃,setValue:forUndefinedKey:的情况。网络请求中常会出现数据和model属性不一致的情况,当字典的key包含model所有的属性,多一些model中不存在属性,不会出现问题。但是当model中的某个属性在字典中是不存在的key,则会崩溃。

利用runtime进行转换

我们可以通过runtime,去获取model这个类的属性列表,通过属性的名字,在字典中寻找到对应的值,进行KVC的赋值。这样既安全又便捷。同理,我们也可以通过遍历类的属性列表,将属性名作为key,属性值作为value,包装成一个字典。

下面代码简单实现的这样的思路。但并不严谨,因为考虑到数据类型和多层嵌套,关键字定义等等很多情况,需要做更严谨的处理。这里我们只是探究这样的思想,保证key-value一一对应,快速转换。

NSDictionary *dic = @{
                        @"name":@"Tom",
                        @"nick":@"cuzz",
                        @"age":@"22"
                    };
                    
Person *p = [[Person alloc]initWithDict:dic];
  
NSLog(@"%@-----%@",p.name,p.nick);
    
NSDictionary *dict = [p convertModelToDict];
    
NSLog(@"%@",dict);

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject

- (instancetype)initWithDict:(NSDictionary *)dict;

- (NSDictionary *)convertModelToDict;

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *nick;

@end

NS_ASSUME_NONNULL_END
#import "Person.h"
#import <objc/message.h>
#import <objc/runtime.h>

@implementation Person


//key-value
//消息发送
// set 方法
//函数指针的格式  (*函数名)(param1,param2)


- (instancetype)initWithDict:(NSDictionary *)dict
{
    self = [super init];
    if (self) {
        
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([self class], &count);
        for (int i = 0; i<count; i++) {
            const void *propertyName = property_getName(properties[i]);
            NSString *name = [NSString stringWithUTF8String:propertyName];
            [self setValue:dict[name] forKey:name];
        }
        free(properties);
        
    }
    return self;
}

//key - value
//key:class_copyPropertyList()
//value:get方法(objc_sendmsg)

- (NSDictionary *)convertModelToDict
{
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
    for (int i = 0; i<count; i++) {
        
        objc_property_t property = properties[i];
        
        const void *propertyName = property_getName(property);
        
        NSString *name = [NSString stringWithUTF8String:propertyName];
        
        SEL sel = NSSelectorFromString(name);
        
        if (sel) {
            id value = ((id(*)(id,SEL))objc_msgSend)(self,sel);
            if (value) {
                tempDic[name] = value;
            }else {
                tempDic[name] = @"";
            }
        }

    }
    
    free(properties);
    
    return tempDic;
}

@end

相关文章

  • Runtime(七)字典转模型

    前言 有很多优秀的第三方框架实现序列化和反序列化的功能。我们可以通过集成这些框架,便捷的实现字典与模型之间的相互转...

  • runtime字典转模型

    KVC:遍历字典中所有key,去模型中找有没有对应的属性名; Student *stu = [[Studental...

  • 字典转模型(runtime)

    接口返回的key转成属性名 model中嵌套子model 字典转模型

  • runtime字典转模型

    KVC实现字典转模型 模型类Status 其中,模型中的属性都是我通过上篇介绍的自动获取模型属性的方式来获得的外部...

  • Runtime字典转模型

    用一个分类实现字典转模型,分类头文件如下: 如果模型的属性有字典数组,想要将该字典数组转换成模型数组,那么在该模型...

  • iOS开发 runtime应用

    1.runtime的作用 字典转模型 动态修改成员变量 方法交换 给分类添加属性 2.字典转模型 原文参考链接:h...

  • runtime运行时之字典模型互转(二)

    上次介绍了runtime自动归档,这次我们来看一下非常常用的-字典转模型/模型转字典。很多朋友都会用到MJExte...

  • ios runtime 实现json转模型

    runtime 字典转模型,主要是利用runtime的class_copyIvarList方法来获取到类中的所有的...

  • 14-Swift中字典转模型

    字典转模型(初始化时传入字典) 字典转模型(利用KVC转化) 一、 普通的字典转模型: 二、利用KVC字典转模型:

  • Runtime实现字典转模型

    导言:开发过程中可能需要根据字典(NSDictionary)转换成模型(Model),而Model一般都是用户自定...

网友评论

      本文标题:Runtime(七)字典转模型

      本文链接:https://www.haomeiwen.com/subject/bnjfsctx.html