KVC中setValuesForKeysWithDictionary:

原文出自:http://www.cnblogs.com/YouXianMing/p/3641304.html

從字典映射到一個對象,這是KVC中的一個方法所提供的,這個方法就是 setValuesForKeysWithDictionary: ,非常好用,不需要你來一一的給對象賦值而直接從字典初始化即可,但用的不好會經常崩潰,本教程就來討論這些使用的細節.

首先,先初始化一個字典,如下所示:

-------------------------------------------------------------------------------------

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                         @"Y.X.",  @"name",
                         @"26",    @"age",
                         @"海淀區", @"address", nil];

-------------------------------------------------------------------------------------

創建PersonInfoModel,代碼如下所示

-------------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

@interface PersonInfoModel : NSObject

@property (nonatomic, strong) NSString  *name;
@property (nonatomic, strong) NSString  *age;
@property (nonatomic, strong) NSString  *address;

@end

-------------------------------------------------------------------------------------

#import "PersonInfoModel.h"

@implementation PersonInfoModel

@end

-------------------------------------------------------------------------------------

測試後打印信息如下:

以上是很標準的使用方法,我們再在屬性中添加 other,如下圖所示:

也沒有出錯,可以正常使用,也就是說用字典初始化對象時,只要對象中都包含了這些鍵值,是可以正常初始化的,我們再在字典中添加一個鍵值對,如下圖所示:

直接導致程序崩潰,因爲該對象中沒有 sex 這個屬性,解決方法就是,實現一個方法setValue:forUndefinedKey:,如下圖所示:

這樣子就會過濾掉給不存在的鍵值賦值,如果有個屬性是id,而id本身就是系統自身關鍵字,不能夠當做屬性使用,怎麼辦?

 

結論:

setValue:forUndefinedKey:這個方法是關鍵,只有存在這個方法後,纔可以過濾掉不存在的鍵值對而防止崩潰,同時,setValue:forUndefinedKey:這個方法中還可以改變系統的敏感字,或者,你手動的映射key值不同的值,隨你自己喜歡.

 

附錄:

哥教你一個一勞永逸的方式來處理這種映射到錯誤鍵值而導致崩潰的問題,首先,你先繼承至 NSObject 類,實現方法setValue:forUndefinedKey:

 

然後,你新建一個model,繼承至 YXModel 類,如下圖所示:

然後使用,請注意,其有一個值爲null,因爲沒有這個myID的鍵值嘛.

解決方法,重載父類的setValue:forUndefinedKey:,然後實現以下替換,即可.

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章