字典转模型,本质上是把数据,建立对应的实体类,用实体类去存储。要操作数据的时候,直接去和实体类去交互。
好处无非是代码可读性更强,编码是操作实体的属性,方便且不易出错。调用者不用关心模型的内部细节。
下面写一个简单的字典转模型的例子,数据我们为了直观些,先直接写了,不搞从什么plist文件读取了。
1 @interface PeopleInfo : NSObject 2 @property(nonatomic,copy)NSString *name; 3 @property(nonatomic,copy)NSString *age; 4 +(instancetype)peopleInfo:(NSDictionary *)dict; 5 -(instancetype)initPeopleInfo:(NSDictionary *)dict; 6 @end 7 @implementation PeopleInfo 8 //实例话对象的方法 ,传进来一个字典对象,返回一个对象时候调用下面的方法,顺便赋值 9 +(instancetype)peopleInfo:(NSDictionary *)dict 10 { 11 return [[self alloc]initPeopleInfo:dict]; 12 } 13 -(instancetype)initPeopleInfo:(NSDictionary *)dict 14 { 15 if(self=[super init]) 16 { 17 self.age=dict[@"age"]; 18 self.name=dict[@"name"]; 19 } 20 return self; 21 } 22 @end 23 -(void)testModel{ 24 25 NSArray *nsa=@[@{@"name":@"A",@"age":@"12"}, 26 @{@"name":@"B",@"age":@"13"}, 27 @{@"name":@"C",@"age ":@"14"}]; 28 29 NSMutableArray *muarr=[NSMutableArray array]; 30 for(NSDictionary *dic in nsa) 31 { 32 [muarr addObject:[PeopleInfo peopleInfo:dic]]; 33 } 34 PeopleInfo *peo=muarr[0]; 35 NSLog(@"%@---%@",peo.age,peo.name); 36 peo.name=@"AAA"; 37 NSLog(@"%@---%@",peo.age,peo.name); 38 PeopleInfo *peo2=muarr[0]; 39 NSLog(@"%@---%@",peo2.age,peo2.name); 40 }
首先是实体类的定义,只有两个属性,然后是两个方法。一个是获得类对象,但是获得类对象需要传进来一个字典对象,传进来的字典对象是在数据源的数组对象里,比如下面的nsa,里面有3个字典对象,每个对象有两个键值对。for循环里字典对象去遍历,把字典对象用dic存起来,然后传给实体类的peoinfo方法, peoinfo又去调用下方的init方法,把dic里的字典对象的值读取出来赋给了自身的属性,最后把自身返回给可变数组muarr存储,此时存储的就是类的实例对象了。在下方的打印语句我们可以看到,用people创建的对象实例接收了数组里的第一个,发现可以通过点语法去读取数据,然后我们修改了这个对象示例的name,发现数组里的数据也发生了修改。再看下这个流程,用字典去读取数组的字典,传递给实体的类方法,然后赋值给类本身,返回本身的对象给使用者存储。这样就完成字典转模型的过程。
然后给一个稍微复杂点的例子来转模型,这个例子是后面tableview学到的,也添加到这里。其实都一样,只不过多一层罢了,所谓的转换也不过是用自身的对象接收传进来的字典对象,字典对象的属性赋给自己的属性,然后返回,也就完成了字典转模型,即NSDictionary--->xxx实体类对象。
1 -(NSArray *)arrGroup{ 2 if(!_arrGroup) 3 { 4 NSArray *nsa=@[ @{@"header":@"0组头",@"footer":@"0组尾",@"wea":@[@{@"name":@"00",@"pictName":@"1.png"}, 5 @{@"name":@"01",@"pictName":@"2.png"} ] 6 7 }, 8 @{@"header":@"1组头",@"footer":@"1组尾",@"wea":@[@{@"name":@"10",@"pictName":@"3.png"}, 9 @{@"name":@"11",@"pictName":@"4.png"} ] 10 11 } 12 13 ]; 14 NSLog(@"%@",nsa); 15 NSMutableArray *weaArr=[NSMutableArray array]; 16 for(NSDictionary *dic in nsa) 17 { 18 weatherModel *weaModel=[weatherModel weatherModelWithdict:dic]; 19 [weaArr addObject:weaModel]; 20 } 21 _arrGroup=weaArr; 22 } 23 return _arrGroup; 24 25 } 26 //--------------------------实体类---------------------------------------------------------------------- 27 @interface weatherModel : NSObject 28 29 //头标题 30 @property(nonatomic,copy)NSString *header; 31 //尾标题 32 @property(nonatomic,copy)NSString *footer; 33 //组内容数据 34 @property(nonatomic,copy)NSArray *arr; 35 36 +(instancetype)weatherModelWithdict:(NSDictionary *)dic; 37 @end 38 @implementation weatherModel 39 40 +(instancetype)weatherModelWithdict:(NSDictionary *)dic 41 { 42 weatherModel *wea=[[self alloc]init]; 43 // [wea setValuesForKeysWithDictionary:dic]; 44 wea.header=dic[@"header"]; 45 wea.footer=dic[@"footer"]; 46 NSMutableArray *arr=[NSMutableArray array]; 47 for(NSDictionary *d in dic[@"wea"]) 48 { 49 weather *w=[weather weatherWithName:d[@"name"] pictName:d[@"pictName"]]; 50 [arr addObject:w]; 51 } 52 wea.arr=arr; 53 return wea; 54 55 } 56 @end 57 @interface weather : NSObject 58 //内容 59 @property(nonatomic,copy)NSString *name; 60 //图片名称 61 @property(nonatomic,copy)NSString *pictName; 62 63 +(instancetype)weatherWithName:(NSString *)name pictName:(NSString *)pictName; 64 +(instancetype)weatherWithName:(NSDictionary *)dic; 65 @end 66 @implementation weather 67 +(instancetype)weatherWithName:(NSString *)name pictName:(NSString *)pictName 68 { 69 weather *wea=[[weather alloc]init]; 70 wea.name=name; 71 wea.pictName=pictName; 72 73 return wea; 74 } 75 +(instancetype)weatherWithName:(NSDictionary *)dic 76 { 77 weather *wea=[[weather alloc]init]; 78 wea.name=dic[@"name"]; 79 wea.pictName=dic[@"pictName"]; 80 return wea; 81 82 }
字典转模型的框架YYModel
1 @interface Model : NSObject 2 @property(nonatomic,copy)NSString *pictname; 3 @property(nonatomic,copy)NSString *text; 4 @end 5 -(void)testYYmodel{ 6 NSArray *arr=@[ @{@"pictname":@"1.png",@"text":@"111111"}, 7 @{@"pictname":@"2.png",@"text":@"22222"} 8 ]; 9 NSArray *modelda=[NSArray yy_modelArrayWithClass:[Model class] json:arr]; 10 Model *mo=modelda.firstObject; 11 NSLog(@"%@---%@",mo.pictname,mo.text); 12 }
我们可以看到断点结果,数组arr存的是两个字典对象,modelda存的是转换完成的model对象.