利用runtime字典转模型

目的:

  在日常开发中我们从字典中取出数据时,往往有可能会因为字典某一个key为关键字,或者我们自己改了,而模型里面可能一共有几十个属性,那么难道我们还要去一个个去写,那还不写到吐血。今天我就来分享如何使用runtime来把字典转换成模型.(这里字典里面是id,但是是关键字,所以模型里面我们是用的ID,所以需要转换)

步骤:

  1.首先依然是不要忘记导入头文件

#import <objc/runtime.h>

  2.首先自定义一个类方法,用来字典转模型,传入参数要转换的字典,还一个就是用来存放被你修改的属性(这里的mapDict)

+ (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict

  3.利用传入的字典转换成模型具体步骤

    - 通过runtime获取当前类的所有属性

    - 利用字典取值,判断有没有值,因为是直接用字典取值,不会报错,如果是空证明没有这个key

    - 这时我们就直接用这个key去后面一个映射字典里面取,看看有没有映射的,这里面有,所以就这样从@“ID”转换成了@“id”

    - [objc setValue:value forKeyPath:ivarName] 成功给模型里面赋值

+ (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict
{
    id objc = [[self alloc] init];

    // 遍历模型中属性
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList(self, &count);

    for (int i = 0 ; i < count; i++) {
        Ivar ivar = ivars[i];

        // 属性名称
        NSString *ivarName = @(ivar_getName(ivar));

        ivarName = [ivarName substringFromIndex:1];

        id value = dict[ivarName];
        // 需要由外界通知内部,模型中属性名对应字典里面的哪个key
        // ID -> id
        if (value == nil) {
            if (mapDict) {
            NSString *keyName = mapDict[ivarName];

            value = dict[keyName];
            }
        }

            [objc setValue:value forKeyPath:ivarName];

    }
    return objc;
}

  

时间: 2024-08-07 10:47:59

利用runtime字典转模型的相关文章

iOS之KVC字典转模型的底层实现

KVC: Key Value Coding (键值编码) 在iOS开发中,KVC是我们经常要使用的技术.那么KVC有什么作用呢?简单列举一下下面几种: 取值和赋值(开发中基本不用) 获取对象私有变量的值.(经常使用,例如UIPageContorl分页, 设置圆点为图片) 改变对象私有变量的值(经常使用) 简单的字典转模型(偶尔使用) 模型转字典 批量取值 KVC字典转模型的底层实现 通常我们手动将字典转模型的话,会在模型中提供一个类方法接收一个字典,在这个方法中将字典转换成模型,再将转换好的模型

利用runTime,实现以模型为主的字典转模型(注意与KVC的区别)

将字典转化为模型,面向模型开发,是在开发中最为常用的功能.利用KVC可以将字典转换为模型,但是前提有三个约束,一个是必须保证模型的属性个数大于等于字典个数,二是属性名称与字典的key必须相同,三是对于模型中的基本数据类型无法转换. 其中第一条与第三条,是其最大的弊端.例如,如果从服务器获取的数据字典,并不想使用所有的键值对.但是在开发中还是必须得全部将对应属性列出,全部进行转换(除非你一个一个写,不使用KVC). 下面的代码就可以解决上述问题:实现以模型为主,将字典数据进行部分转化,并识别基本数

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字典,得到所有的key,value值,再利用kvc, setVaue forkey来为value赋值 2: [item setValue:@"来自即刻笔记" forKey:@"source"],内部的底层实现, 1.首先去模型中查找有没有setSource,找到,直接调用

ios开发- 利用运行时(runtime)字典转模型

现在的ios开发中,我们通常会使用MVC模式.当我们拿到数据的时候,我们要把数据转成模型使用. 一般情况我们拿到的数据都是字典.这是我们就需要将字典转成模型对象了. 当对象的属性很少的时候,我们可以直接单独写出字典的键值,进行转换. _属性 = dict["键"] 当对象的属性很多的时候,我们可以利用KVC批量设置. setValuesForKeysWithDictionary:<#(NSDictionary *)#> 但是KVC批量转的时候,有个致命的缺点,就是当字典中的

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

字典转模型KVC和runtime二者实现与区别

我们知道在开发中,字典转模型是一种很常用的设计模式,当字典中元素的个数比较少的时候,我们可以直接用dic[key]去给模型对象的属性赋值,但是当字典中元素的个数比较多的时候,再用前面的解决方法就不行了,所以就有了KVC(key value coding:键值编码)字典转模型的设计模式. KVC的设计原理: [item setValue:@"value" forKey:@"property"]: 1.首先去模型中查找有没有setProperty,找到,直接调用赋值 [

iOS开发——高级技术精选OC篇&amp;Runtime之字典转模型实战

Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://www.cnblogs.com/iCocos/p/4676679.html http://www.cnblogs.com/iCocos/p/4725527.html 关于runtime的详细介绍及其相关的小实例 好了,这里就不多废话了,直接开干! 先来看看怎么使用Runtime给模型类赋值 iOS开发

Runtime-字典转模型KVC实现

// // NSObject+Model.m // 05-runtime(字典转模型KVC实现) // // Created by kun on 16/8/17. // Copyright © 2016年 kun. All rights reserved. // #import "NSObject+Model.h" #import <objc/message.h> @implementation NSObject (Model) + (instancetype)modelW

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运行时自己一直很晕.不过还是整理下来,方便以后用. 这里直接创建了一个分类. 头文件代码 1 // 2 // NSObject+Model.h 3 // Chaos_G 4 // 5 6 #import <Foundation/Foundation.h> 7 8 @interface NSObjec