在开发中,我们得到后台返回的json数据时,经常根据返回的字典数组格式然后创建一个model去解析数据,实质其实就是根据后台的字段进行一一对应,通过setValue forKey方法将一个字典进行包装然后封成一个对象。一般来说有多少个数据模型就需要创建多少个model文件,但是其中很多字段都是重复的,这样造成了一定的臃肿和麻烦。其实有一个方法
setValuesForKeysWithDict
ionary:此方法
不需要你来一一的给对象赋值而直接从字典初始化即可,但是如果遇到后台返回的关键字我们也可以通过
setValue:(id)value forUndefinedKey:(NSString *)key方法进行修改,同时此方法可以过滤掉不存在的键值对而防止崩溃,或者修改你手动的映射key值不同的值
在model.m文件中
#import "ModelData.h"
@implementation ModelData
+ (ModelData*)itemWithDictionary:(NSDictionary *)dictionary
{
return [[self alloc]initItemWithDictionary:dictionary];
}
- (instancetype)initItemWithDictionary:(NSDictionary *)dictionary
{
self = [super init];
if(self)
{
[self setValuesForKeysWithDictionary:dictionary];
}
return self;
}
//将id关键字转为Id,将数值字段字符串转为float类型
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
if([key isEqualToString:@"id"])
{
self.Id = value;
}
}
当然这样还并不是万能的,我们还需要做一些小小的操作,以防不测,比如一些没有声明定义的属性,这时会crash,必须加上一下两个方法防止崩溃
在model.h文件中,除了一些关键字或者个人想修改的字段值,其他字段都需要和后台保持一一对应,如
#pragma mark - 银行卡信息
@property(nonatomic,retain)NSMutableArray *banks;//平台提供银行数组
@property(nonatomic,copy)NSString *bank_name;//银行名称
@property(nonatomic,copy)NSString *bank_branch;//支行名称
@property(nonatomic,copy)NSString *bank_account;//银行卡号
@property(nonatomic,copy)NSString *bank_user;// 银行户主
@property(nonatomic,copy)NSString *alipay;// 支付宝账户
@property(nonatomic,copy)NSString *alipay_user;// 支付宝姓名
@property(nonatomic,copy)NSString *bank_msg;//提示信息
#pragma mark - 余额列表
@property(nonatomic,copy)NSString *Id;//提现记录id
@property(nonatomic,copy)NSString *info; //提现信息
@property(nonatomic,copy)NSString *create_time; //提现时间
这样一来,我们只需要在公共方法中创建一个model类对象即可,需要什么字段只需要在.h文件中添加相应字段,且在使用时只需要进行初始化调用,这样就非常省事了。如果一个项目过大,每遇到一个对象就创建一个那样就需要创建很多model文件,不得吓死人啊!
ModelData *model = [[ModelData alloc]initItemWithDictionary:dictionary];
[totalArr addObject:model];
在这可参考以下文章
http://blog.csdn.net/worldzhy/article/details/49982179
http://blog.csdn.net/hdfqq188816190/article/details/48679909