KVC(KeyValueCoding)
(1)賦值類方法
- (void)setValue:(nullableid)value forKey:(NSString*)key;
- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;- (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
(2)取值類方法// 能取得私有成員變量的值
- (id)valueForKey:(NSString*)key;
- (id)valueForKeyPath:(NSString*)keyPath;
- (NSDictionary*)dictionaryWithValuesForKeys:(NSArray*)keys;
KVC 底層實現(xiàn)原理
假設(shè)key = @"name", 以下順序執(zhí)行,前一條件不成立,則執(zhí)行下一個。
1.? 判斷是否有@"name"的set方法,有則賦值;
2. 判斷有無_name(帶下劃線的)成員變量,有則賦值
3. 判斷有無同名屬性,有則賦值
4. 執(zhí)行valueforUndefinedKey, setValue:forUndefinedKey:
KVC使用場景:
Person *p = [[Person alloc] init];
p.name = @"rose";
使用setValue:forKey:方法能夠給屬性賦值,等價于直接給屬性賦值[p setValue:@"rose" forKey:@"name"];
這是常見用法;
但是,
如果私有成員變量,例如Person的.m文件中有一個_age, 該怎么賦值?
通過setValue:forKeyPath:方法。
Person *p = [[Person alloc]init];
[p setValue:@"Apple" forKeyPath:@"_age"];
假如Person中有一Dog類型的屬性myDog,Dog是一個獨立的類,Dog有個屬性名name, 該怎么賦值?
同樣通過setValue:forKeyPath:方法。
[p setValue:@"Apple" forKeyPath:@"myDog.name"];
字典轉(zhuǎn)模型,?setValuesForKeysWithDictionary:dict是關(guān)鍵
+(instancetype)videoWithDict:(NSDictionary*)dict{?
?JLVideo *videItem = [[JLVideo alloc] init];
[videItem setValuesForKeysWithDictionary:dict];returnvideItem;
}
取值, 獲取值后存于新創(chuàng)建的NSDictionary
? ? Person *p = [[Person alloc]init];
? ? p.name = @"Angel";
? ? p.age = @"12";
? ? NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name",@"age"]];
? ? NSLog(@"%@", dict);
把多個模型Dog放入數(shù)組中,想要提取數(shù)組模型Dog的屬性name的值用于列表展示,該怎么做?
再次遍歷模型,然后把對應(yīng)的name的值存放于新數(shù)組中?
這一定是可行的,但是否過于麻煩?
能否簡便一些?
? ? Dog*d1 = [[Dogalloc]init];
? ? d1.name? =@"DoLin";
? ? Dog*d2 = [[Dogalloc]init];
? ? d2.name? =@"Apple";
? ? Dog*d3 = [[Dogalloc]init];
? ? d3.name? =@"Jucie";
? ? NSArray*arrays =@[d1,d2,d3];
? ? NSLog(@"我的數(shù)組名字結(jié)果---%@",[arrays valueForKeyPath:@"name"]);
arrays用于存放數(shù)組,當(dāng)我想提取所有模型Dog的name值,直接調(diào)用[arrays valueForKeyPath:@"name"],即可得到一個新的只有名字的數(shù)組,是不是很便利?
如果Person類有一個數(shù)組,專門用于存放Dog,?想要提取Person數(shù)組中Dog的屬性name的值用于列表展示,該怎么做?
大家首先想到的可能還是,再次遍歷模型,然后把對應(yīng)的name的值存放于新數(shù)組中?
我們換個新方式
? ? Dog *d1 = [[Dog alloc]init];
? ? d1.name? =@"DoLin";
? ? Dog*d2 = [[Dogalloc]init];
? ? d2.name? =@"Apple";
? ? Dog*d3 = [[Dogalloc]init];
? ? d3.name? =@"Jucie";
? ? Person *p = [[Person alloc]init];
? ? p.dogArrays=@[d1,d2,d3];
? ? NSLog(@"%@",[p valueForKeyPath:@"dogArrays.name"]);
講多個Dog實例存放于Person類型的dogArrays數(shù)組里,調(diào)用[p valueForKeyPath:@"dogArrays.name"]即可得到相應(yīng)的數(shù)據(jù)