别人写的,写的不错,收藏一波
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);
}
网友评论