用KVC中setValuesForKeysWithDictionary:方法模型化一个字典

在iOS日常开发中我们会经常用到模型来创建数据,因为这样的数据逻辑性,可扩展性,可视化程度均高于普通的字典形式。

一般来说,我们的数据格式是固定的,key-values个数也是固定的,所以我们通常会用setValuesForKeysWithDictionary:方式,直接从字典中的键值对来创建模型。

但是时间长了你会发现这种方式创建模型有一个很大的弊端,当字典中的key-values个数不固定时,程序会崩掉,因为key-values不能全部匹配。

如果我们想省事,用这种方式来创建,那么我们可以再加上一个方法接收Undefined的key-values。这样就可以了。

例子如下:

#import "BaseModel.h"

@interface TestModel : NSObject

@property (nonatomic,copy)NSString * name;
@property (nonatomic,copy)NSString * age;

@end
#import "TestModel.h"

@implementation TestModel

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"%@---%@",value,key);
}

@end
模型如上所示。这样当有未知的key-values时,会被过滤掉。

调用:

    NSDictionary * dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"lili",@"name",@"30",@"age",@"3",@"class",@"TingHua",@"school", nil];
    TestModel * model = [[TestModel alloc]init];
    [model setValuesForKeysWithDictionary:dic];
    NSLog(@"----%@",model.age);

----------------上面的方法已经满足基本需求了,但是作为程序员,我们的目的是简洁性越高越好啦--------------------------

所以,我们在工程中可以创建一个基类模型。

#import <Foundation/Foundation.h>

@interface BaseModel : NSObject

@end

#import "BaseModel.h"

@implementation BaseModel

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}

@end

然后让所有的模型都继承于这个模型。这样我们在创建模型的时候就不用每次都添加setValue:(id)value forUndefinedKey:方法了。

如果我们确实需要这些key-values怎么办?在需要的模型类里,复写setValue:(id)value forUndefinedKey:这个方法即可!

---------------------------以上创建方式已经可以解决了,但是我还是推荐我比较习惯的方式,仅供大家参考--------------------------------------

#import "BaseModel.h"

@interface PersonModel : BaseModel
@property (nonatomic,copy)NSString * name;
@property (nonatomic,copy)NSString * age;

+ (instancetype)initWithDictionary:(NSDictionary *)dic;
- (instancetype)initWithDictionary:(NSDictionary *)dic;
@end

#import "PersonModel.h"

@implementation PersonModel
- (instancetype)initWithDictionary:(NSDictionary *)dic
{
    if (self = [super init]) {
        _name = dic[@"name"];
        _age  = dic[@"age"];
    }else
    {
        NSAssert(!self, @"初始化失败!");
    }
    return self;
}
+ (instancetype)initWithDictionary:(NSDictionary *)dic
{
    return [[PersonModel alloc]initWithDictionary:dic];
}
@end

ok!



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值