eg:setValue(self.name, forKey:dict[“name”])
*這種賦值方法很麻煩,每需要壹個key值就要打壹遍該方法。這樣的賦值方式就和self.name = dict[“name”] 的區別不是太大
2. setValuesForKeysWithDictionary(傳入的字典)
eg: setValuesForKeysWithDictionary(dict)
*直接完成賦值,其實setValuesForKeysWithDictionary(傳入的字典),它默認也是調用setValue(模型屬性, forKey:字典的key值 ),遍歷字典壹壹給模型屬性賦值。所以使用KVC時就要求模型的屬性必須喝字典的key值壹壹對應。
需求二:如果我們只想使用字典中的部分值呢?壹個大字典,裏面有好幾十個key,難道我們還要在模型中根據key值定義幾十個屬性麽?當然我們程序猿都是很懶的,肯定不會定義這麽多key值的,此時我們只需重寫KVC的以下方法就行了:
3.setValue(value: AnyObject?, forUndefinedKey key: String)
*這個方法會幫我們過濾我們沒有的key值,值執行 setValuesForKeysWithDictionary(dict)時,當監測出我們沒有字典中key值所對應的屬性時就會調用這個方法。
*重寫時裏面不需要寫任何代碼,如果想打印哪些key值我們沒有時就可以在裏面打印。
需求三:我們知道很多字典中都有“id”這個key值。而“id”在我們iOS中是個數據類型,顯然不能將“id”當作模型屬性名稱去定義。此時我們只需要隨意定義壹個屬性名去保存“id”,當然為了更已讀、嚴謹壹些,我們壹般還是定義為“ID”最為恰當。而我們知道要使用KVC就要key值和模型名壹壹對應,但是我們就是想要獲取“id”。此時需要將“需求壹”和“需求二”結合起來看了。我們在獲取“id”時,直接使用傳入的字典賦值:(此時我們新添壹個屬性“ID”)
eg :self.ID = dict[“id”]
*當這樣賦值之後就取出”id “所對應的value了。
但是我們還要獲取其他的value呢,此時在使用 setValuesForKeysWithDictionary(dict)完成其他屬性的賦值。當然也需要重寫setValue(value: AnyObject?, forUndefinedKey key: String)方法,因為字典中並有“ID”這個key值(字典中是“id”,“ID”是模型新定義的屬性)。完整代碼如下 :
swift:
override init() {
super.init()
self.ID = dict[@"id”];
setValuesForKeysWithDictionary(dict)
}
override func setValue(value: AnyObject?, forUndefinedKey key: String) { }
OC:
+ (instancetype) testWithDict:(NSDictionary *)dict{
TEST *test = [[TEST alloc]init];
test.ID = dict[@"id"];
[test setValuesForKeysWithDictionary:dict];
return test;
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
}