iOS开发setValuesForKeysWithDictionary生成model解析神器

在开发中,我们得到后台返回的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,必须加上一下两个方法防止崩溃

[objc]  view plain  copy
  1. #pragma mark 安全设置  
  2. - (void)setValue:(id)value forUndefinedKey:(NSString *)key{  
  3.     NSLog(@"setValue--%s",__func__);  
  4. }  
  5.   
  6. - (void)setNilValueForKey:(NSString *)key {  
  7.     NSLog(@"setNilValueForKey--%s",__func__);  
  8. }  

在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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值