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

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

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字典转模型几种方法)