用KVC中setValuesForKeysWithDictionary:方法模型化一個字典
阿新 • • 發佈:2019-02-18
在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!