1. 程式人生 > >用KVC中setValuesForKeysWithDictionary:方法模型化一個字典

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