IOS:个人笔记|UI_字典转模型

字典转模型,本质上是把数据,建立对应的实体类,用实体类去存储。要操作数据的时候,直接去和实体类去交互。
好处无非是代码可读性更强,编码是操作实体的属性,方便且不易出错。调用者不用关心模型的内部细节。
下面写一个简单的字典转模型的例子,数据我们为了直观些,先直接写了,不搞从什么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对象.

 

posted @   DDD-SagerKing  阅读(183)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示
主题色彩