在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!