key-value coding酱床,使用字符串更改對(duì)象狀態(tài)
介紹
- 用途:
1.訪問私有屬性
2.整體操作(計(jì)算)
3.批處理對(duì)象屬性
- 原理:根據(jù)傳入的字符串去對(duì)象內(nèi)尋找相應(yīng)屬性的 getter/setter,如果沒有,尋找對(duì)象內(nèi)以“_字符串”命名的實(shí)例變量
- 特點(diǎn):自動(dòng)裝箱(
valueForKey:
),自動(dòng)開箱(setValue:forKey:
)
- 缺點(diǎn):
1.需要解析字符串,速度較慢
2.編譯器無法進(jìn)行錯(cuò)誤檢查
用法
-
valueForKey:
,setValue:forKey:
ZWQPerson *personA = [[ZWQPerson alloc] initWithName:@"David"
phoneNumber:@12345678911
friends:nil];
personA.item = item1;
ZWQPerson *personB = [[ZWQPerson alloc] initWithName:@"Lee"
phoneNumber:@12345678912
friends:nil];
personB.item = item2;
ZWQPerson *personC = [[ZWQPerson alloc] initWithName:@"Levis"
phoneNumber:@12345678913
friends:@[personA,personB]];
personC.item = item3;
// KVC
NSString *personName = [personC valueForKey:@"name"];
NSLog(@"%@",personName); // Levis
[personC setValue:@"Wade"
forKey:@"name"];
NSLog(@"%@",personC.name); // Wade
- 帶鍵路徑(路徑深度任意)
valueForKeyPath:
,setValue:forKeyPath:
// 帶鍵路徑的 KVC
NSString *itemName = [personC valueForKeyPath:@"item.itemName"];
NSLog(@"%@",itemName); // c
[personC setValue:@"abc"
forKeyPath:@"item.itemName"];
NSLog(@"%@",personC.item.itemName); // abc
// 對(duì)數(shù)組進(jìn)行整體操作
NSArray *persons = @[personA,personB,personC];
NSArray *nameOfPersons = [persons valueForKey:@"name"];
NSLog(@"%@",nameOfPersons); // (David,Lee,Wade)
NSArray *nameOfFriends = [personC valueForKeyPath:@"friends.name"];
NSLog(@"%@",nameOfFriends); // (David,Lee)
// 整體操作時(shí)進(jìn)行運(yùn)算(@sum,@avg,@min,@max,@distinckUnionOfObjects)
NSNumber *sumOfPhoneNumber = [persons valueForKeyPath:@"@sum.phoneNumber"];
NSLog(@"%@",sumOfPhoneNumber); // 37037036736
NSNumber *sumOfFriendsPhoneNumber = [personC valueForKeyPath:@"friends.@sum.phoneNumber"];
NSLog(@"%@",sumOfFriendsPhoneNumber); // 24691357823
// 批處理
NSArray *keys = @[@"name",@"phoneNumber"];
NSDictionary *personMessages = [personC dictionaryWithValuesForKeys:keys];
NSLog(@"%@",personMessages); // {name = Wade;phoneNumber = 12345678913;}
NSString *newPersonName = @"Adam";
NSNumber *newPhoneNumber = @12345678900;
NSDictionary *newPersonMessages = @{@"name" : newPersonName , @"phoneNumber" : newPhoneNumber};
[personC setValuesForKeysWithDictionary:newPersonMessages];
NSLog(@"%@ %@",personC.name,personC.phoneNumber); // Adam 12345678900
- 防御式編程
setNilValueForKey
军洼,setValue:forUndefinedKey:
,valueForUndefinedKey:
// 用來接收未定義鍵值的字典
@property (nonatomic,strong) NSMutableDictionary *valuesForUndefinedKeys;
...
// 接受 nil 值的特殊處理
- (void)setNilValueForKey:(NSString *)key{
if ([key isEqualToString:@"itemNumber"]) {
self.itemNumber = 0;
} else {
[super setNilValueForKey:key];
}
}
// 接收未定義的鍵的處理
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
[self.valuesForUndefinedKeys setObject:value forKey:key];
}
// 取未定義鍵值的處理
- (id)valueForUndefinedKey:(NSString *)key{
return [self.valuesForUndefinedKeys objectForKey:key];
}