iOS 字典转模型

作者: azhang_coder | 来源:发表于2016-11-27 23:48 被阅读0次

    字典转模型


    • 1.简单的字典转模型
    
    -(instancetype)initWithDict:(NSDictionary *)dict
    
    {
    
     if (self=[super init]) {
    
     self.name=dict[@"name"];
    
     self.icon=dict[@"icon"];
    
     //简单的字典转模型可以直接采用KVC来转
    
    // [self setValuesForKeysWithDictionary:dict];
    
     }
    
     return self;
    
    }
    
    +(instancetype)carsWithDict:(NSDictionary *)dict
    
    {
    
     return [[self alloc]initWithDict:dict];
    
    }
    
    
    • 2.字典中包含数组
    • 2.1首先在头文件创建一个数组包含子模型

    • 2.2在.m文件中将字典模型转为车模型后存放入车模型数组中

    
    /*分组 */
    
    @interface AZCarGroup : NSObject
    
    /*车模型数组 */
    
    @property(nonatomic,strong)NSArray *cars;
    
    /*组名*/
    
    @property(nonatomic,copy)NSString *title;
    
    -(instancetype)initWithDict:(NSDictionary *)dict;
    
    +(instancetype)carGroupWithDict:(NSDictionary *)dict;
    
    
    
    -(instancetype)initWithDict:(NSDictionary *)dicts
    
    {
    
     if (self=[super init]) {
    
     self.title=dicts[@"title"];
    
     //将字典数组中的字典转为车模型存放到头文件的数组中
    
     NSMutableArray *cars=[NSMutableArray array];
    
     for (NSDictionary *dict in dicts[@"cars"]) {
    
     AZCar *car=[AZCar carsWithDict:dict];
    
     [cars addObject:car];
    
     }
    
     self.cars=cars;
    
     }
    
     return self;
    
    }
    
    +(instancetype)carGroupWithDict:(NSDictionary *)dicts
    
    {
    
     return [[self alloc]initWithDict:dicts];
    
    }
    
    
    • 一般在使用我们的模型数据时采用懒加载方式加载
    
    //所有车数据
    
    -(NSArray *)carGroups
    
    {
    
     if (_carGroups==nil) {
    
     //加载plist数据
    
     NSArray *dictArr=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"cars.plist" ofType:nil]];
    
     //字典转模型
    
     NSMutableArray *tempArray=[NSMutableArray array];
    
     for (NSDictionary *dict in dictArr) {
    
     AZCarGroup *carGroup=[AZCarGroup carGroupWithDict:dict];
    
     [tempArray addObject:carGroup];
    
     }
    
     self.carGroups=tempArray;
    
     }
    
     return _carGroups;
    
    }
    
    
    • 3.MJExtension框架的使用

      • 首先导入框架

      • 确定Cars里面装的AZCar模型

      • 将模型装入数组

      • 框架的使用简化了复杂机械的字典转模型操作

    #import "MJExtension.h"

    
     //所有车数据 
    
    -(NSArray *)carGroups
    
    {
    
     if (_carGroups==nil) {
    
     //通过返回的字典确定cars数组中所装的内容为AZCar模型
    
     [AZCarGroup mj_setupObjectClassInArray:^NSDictionary *{
    
        return @{@"cars":[AZCar class]};
    
     }];
    
     _carGroups=[AZCarGroup mj_objectArrayWithFilename:@"cars.plist"];
    
     }
    
     return _carGroups;
    
    }
    
    
    • 4.修改模型属性类型
        /**
        [item setValue:@"中国" forKeyPath:@"name"];
         setValue:forKeyPath实现原理
         1.先查看有没有对应key值的set方法,如果有set方法,就会调用set方法,给对应的属性赋值
         2.如果没有set方法,去查看有没有跟key值相同并且带有下划线的成员属性.如果有的话,就给带有下划线的成员属性赋值
         3.如果没有跟key值相同并且带有下划线的成员属性,还会去找有没有跟key值相同名称的成员属性.如果有,就给它赋值.
         4.如果没有直接报错.
         */```
    
    

    //setValuesForKeysWithDictionary实现原理
    [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
    [item setValue:obj forKeyPath:key];
    NSLog(@"%@--%@",key,obj);
    }];

    return item;
    

    }

    // 可以在set方法赋值前修改该属性类型(运行时)
    -(void)setIcon:(UIImage *)icon{

    NSString *imageName = (NSString *)icon;
    _icon =  [UIImage imageNamed:imageName];
    

    }

    -(void)setIcon:(NSString *)icon{

    // NSString *imageName = (NSString *)icon;

    _icon =  [UIImage imageNamed:icon];
    

    }

    
    
    

    相关文章

      网友评论

        本文标题:iOS 字典转模型

        本文链接:https://www.haomeiwen.com/subject/ktnnpttx.html