字典转模型

network | | 访问(70)
// 定义临时数组
NSMutableArray *muArray = [[NSMutableArray alloc] init];
// 循环遍历数组,依次转换成模型
for (NSDictionary *dict in _categoryArray) {
    CategoryModel *cateModel = [[CategoryModel alloc] init];
    cateModel.name=dict[@"name"];
    cateModel.tag=[dict[@"tag"] integerValue];
    [muArray addObject:cateModel];
}
_categoryArray = muArray;
 
 
优化后的代码
CategoryModel.h 文件
#import <Foundation/Foundation.h>
 
/** 消费记录分类模型对象 */
@interface CategoryModel : NSObject
 
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger tag;
/**
 instancetype 主要用于在类方法实例化对象时,让编译器主动推断对象的实际类型
 
 以避免使用id,会造成开发中不必要的麻烦,减少出错几率!
 
 instancetype是苹果在iOS7才开始主推的
 
 C++11 auto
 在swift语言中,绝大多数类的实例化,都不需要再指定类型
 
 instancetype只能用于返回值使用!!!不能当做参数使用
 */
 
/** 通常在写模型的实例化方法时,以下两个方法,都需要实现 */
/** 使用字典实例化模型 */
- (instancetype)initWithDict:(NSDictionary *)dict;
/** 类方法可以快速实例化一个对象 */
+ (instancetype)modelWithDict:(NSDictionary *)dict;
 
@end
 
CategoryModel.m文件
#import "CategoryModel.h"
 
@implementation CategoryModel
 
-(instancetype)initWithDict:(NSDictionary *)dict{
    // self 是 对象
    self = [super init];
    if(self){
        // 用字典给属性赋值
        self.name = dict[@"name"];
        self.tag = [dict[@"tag"] integerValue];
    }
    return self;
}
 
+ (instancetype)modelWithDict:(NSDictionary *)dict{
    // self 是 class
    return [[self alloc] initWithDict:dict];
}
 
@end
 
转换时的代码
for (NSDictionary *dict in _categoryArray) {
    // 类方法可以快速的实例化一个对象
    //CategoryModel *cateModel = [[CategoryModel alloc] initWithDict:dict];
    // 另一种方法
    CategoryModel *cateModel = [CategoryModel modelWithDict:dict];
    // cateModel.name=dict[@"name"];
    // cateModel.tag=[dict[@"tag"] integerValue];
    [muArray addObject:cateModel];
}
 
KVC 键值编码
-(instancetype)initWithDict:(NSDictionary *)dict{
    // self 是 对象
    self = [super init];
    if(self){
        // 用字典给属性赋值
        // self.name = dict[@"name"];
        // self.tag = [dict[@"tag"] integerValue];
        
        // KVC - key value coding键值编码,是一种间接修改/读取对象属性的一种方法
        // 参数:
        // 1. 数值
        // 2. 属性名称
        // [self setValue:dict[@"name"] forKeyPath:@"name"];
        // [self setValue:dict[@"tag"] forKeyPath:@"tag"];
        // setValuesForKeysWithDictionary本质上就是调用以上两句代码
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}