zoukankan      html  css  js  c++  java
  • 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对象.

  • 相关阅读:
    CSP-S2019游记
    SOJ 一句话题解整理
    CF547E Mike and Friends
    CF506E Mr. Kitayuta's Gift
    在windows环境下安装和使用Python(CPython)
    GeekGame2020_部分WriteUp
    php通过curl传输JSON对象
    Invalid datetime format: 1292 Incorrect datetime value
    解决 select2 开启 tags 不能输入中文的问题
    electerm 设置同步(Setting sync)
  • 原文地址:https://www.cnblogs.com/kc1995/p/13755343.html
Copyright © 2011-2022 走看看