美文网首页
关于iOS字典转模型几种方法

关于iOS字典转模型几种方法

作者: 丶逝水流年 | 来源:发表于2017-04-29 08:59 被阅读570次

    别人写的,写的不错,收藏一波

    1:KVC    2:runTime字典转模型

    先说说两种的不同:KVC是遍历字典中的key值,去模型类里面去查找有没有所对应的key,runtime反之是遍历属性在字典里面去查找有没有对应的key,在实际开发中,因为后台返回的数据比较多,可用的字段就比较少,所以用runtime效率较高。

    KVC原理:键值编码是用来间接访问对象属性的机制,通过setValue:forKey和ValueForkey来访问成员变量,代码量比较少使用比较简单。

    使用方法:

    1.创建一个Model类,在.h里面声明两个方法,并且声明需要的属性(可以参照我写的自动声明属性去完成这个步骤)

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

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

    2.在.m里面去实现

    - (instancetype)initWithDictionary:(NSDictionary *)dict

    {

    if (self = [super init]) {

    [self setValuesForKeysWithDictionary:dict];

    }

    return self;

    }

    + (instancetype)provinceWithDictionary:(NSDictionary *)dict

    {

    return [[self alloc] initWithDictionary:dict];

    }

    3.在这里我们直接可以在ViewController里面调这个方法

    VisitorModel *model = [VisitorModel provinceWithDictionary:temDic];就完成了赋值了

    注意:我们在使用KVC过程中因为是通过字典去在你模型类里面去查找有没有这个属性:或者字典里面有关键字:程序会抛出异常,这里我们要玩成一个方法:

    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{

    }

    这个写着就没事了,如果是id类型,我们先声明一个ID属性,然后给它赋值。

    KVC的使用就介绍这么多,使用起来也是很方便的。

    第二种:runtime字典转模型

    先说说一级的字典转模型

    步骤1.首先创建一个model类还是通过我封装的自动声明属性,然后把输出的粘贴到.h里面

    步骤2:直接调用我这封装的就可以了,封装内部的原理如下

    1.创建一个分类 NSObject (model)

    2,在.h里面写一个方法

    +(instancetype)modelWithDic:(NSDictionary*)dict;只需要传入一个字典就会自动转模型的

    3.在.m里面实现方法

    +(instancetype)modelWithDic:(NSDictionary*)dict{

    1.先创建一个类的对象

    id objc =  [[self alloc]init];

    2.//这里需要穿一个cout的地址,其中cout就是成员属性总数

    unsigned int count = 0;

    3这个方法是把传进来的Model的成员变量属性复制一分,其中Ivar*实际上就是只想一个成员变量的数组(注意区分成员属性和属性)

    Ivar  *ivarPlist =class_copyIvarList(self, &count);

    4.遍历这个数字,此时count的值已经变成你成员变量属性的个数

    for (int i=0; i

    (1):获取到一个成员属性名

    Ivar ivar1 = ivarPlist[i];

    (2):获取到成员名

    NSString *propertyName =    [NSString stringWithUTF8String: ivar_getName(ivar1)]

    (3.)获取到成员属性(这个返回值是c语言,所以转换了一下)

    NSString *propertyType =    [NSString stringWithUTF8String:      ivar_getTypeEncoding(ivar1)];

    (4),获取key(注意成员属性和属性的区别)

    NSString *key = [propertyName substringFromIndex:1];

    (5),获取Value

    id Value= dict[key];

    (6).通过KVC进行赋值(因为Value如果为空,直接Crash,所以这里判断了一下,如果有值再去赋值)

    if (Value) {

    [objc setValue:Value forKey:key];//用kvc复制value不能为空

    }

    (7).return objc;

    }

    这个方法也是比较容易理解的,上面只是介绍了一级字典转模型,二级其实也非常简单

    二级字典转模型:

    假如我们返回数据里面有一个字典,字典里面还有一个字典,我们我们必须再创建一个UserMode类,然后自动生成属性,然后@class User;   再Model.h里面声明这个属性。

    继续在上面的for循环里面实现一下代码:

    判断Value类型是不是字典,或者属性名称不包含NSDictionary

    if ([Value isKindOfClass:[NSDictionary class]] &&![propertyType containsString:@"NS"]) {

    1.直接将属性类型转换成类

    Class modelClass =NSClassFromString(propertyType);

    2.直接给赋值

    if (modelClass) {

    Value =  [modelClass modelWithDic:Value];

    }

    [注意:这里是不行的,因为第类型转换成类返回值不是User  而是@\"user “\],所以你要进行字符串截取,具体

    propertyType substringFromIndex:range.location +range.length]

    range =[propertyType rangeOfString:@"\""];

    propertyType = [propertyType substringToIndex:range.location];

    Class modelClass =NSClassFromString(propertyType);

    }

    相关文章

      网友评论

          本文标题:关于iOS字典转模型几种方法

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