- NSObject分類(NSKeyValueCoding)方法世曾,NSArray,NSSet等也創(chuàng)建了這個(gè)分類
- 全稱:Key Value Coding(鍵值編碼)
- 應(yīng)用場(chǎng)景:修改或獲取私有成員的屬性值;字典批量轉(zhuǎn)模型并賦值
// 能修改私有成員變量
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
// 能取得私有成員變量的值
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
//如果valueForKeyPath:方法的調(diào)用者是數(shù)組娇昙,那么就是去訪問(wèn)數(shù)組元素的屬性值
//字典批量轉(zhuǎn)模型并賦值
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
KVC底層實(shí)現(xiàn)
// 利用KVC字典轉(zhuǎn)模型
[flag setValuesForKeysWithDictionary:dict];
// setValuesForKeysWithDictionary底層實(shí)現(xiàn):
// 1.遍歷字典中的所有key
//[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// 2.給模型的屬性賦值,利用KVC,把字典中的key當(dāng)做模型的屬性名使用,字典中的值傳遞給模型的屬性.
[flag setValue:obj forKey:key];
// KeyPath:模型中的屬性名
// 屬性的值
// [flag setValue:dict[@"name"] forKey:@"name"];
// [flag setValue:dict[@"icon"] forKey:@"icon"];
}];
// setValue:forKey:底層實(shí)現(xiàn)
// 給模型中的icon屬性賦值
// [flag setValue:dict[@"icon"] forKey:@"icon"];
// 1.首先去尋找模型中有木有set方法,直接調(diào)用set方法,[flag setIcon:dict[@"icon"]]
// 2.接著尋找模型中有沒(méi)有icon的屬性名,如果有,就直接賦值 icon = dict[@"icon"]
// 3.接著尋找模型中有沒(méi)有_icon的屬性名,如果有,就直接賦值 _icon = dict[@"icon"]
// 4.找不到,調(diào)用'setValue:forUndefinedKey:'净刮,直接報(bào)錯(cuò)