KVC中setValuesForKeysWithDictionary:
從字典對映到一個物件,這是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:,然後實現以下替換,即可.