咱們看下官方給的定義:ios
Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties. 【譯】KVC 是經過 NSKeyValueCoding 這個非正式協議啓用的一種機制,而遵循了這個協議的對象就提供了對其屬性的間接訪問。api
直接對屬性或者成員變量進行取值和賦值數組
LGPerson *person = [[LGPerson alloc] init];
[person setValue:@"KC" forKey:@"name"];
[person setValue:@19 forKey:@"age"];
[person setValue:@"酷C" forKey:@"myName"];
NSLog(@"%@ - %@ - %@",[person valueForKey:@"name"],[person valueForKey:@"age"],[person valueForKey:@"myName"]);
複製代碼
針對集合屬性,能夠直接經過mutableArrayValueForKey對對象的集合屬性進行操做更改bash
person.array = @[@"1",@"2",@"3"];
// KVC 的方式
NSMutableArray *ma = [person mutableArrayValueForKey:@"array"];
ma[0] = @"100";
NSLog(@"%@",[person valueForKey:@"array"]);
複製代碼
針對結構體,KVC也能夠直接操做,可是操做時候須要將結構體轉成NSValue類型dom
typedef struct {
float x, y, z;
} ThreeFloats;
ThreeFloats floats = {1., 2., 3.};
NSValue *value = [NSValue valueWithBytes:&floats objCType:@encode(ThreeFloats)];
[person setValue:value forKey:@"threeFloats"];
NSValue *reslut = [person valueForKey:@"threeFloats"];
NSLog(@"%@",reslut);
ThreeFloats th;
[reslut getValue:&th] ;
NSLog(@"%f - %f - %f",th.x,th.y,th.z);
複製代碼
假如對象的屬性也是對象,那麼KVC能夠經過keyPath來操做對象屬性的屬性ide
LGStudent *student = [[LGStudent alloc] init];
student.subject = @"iOS";
person.student = student;
[person setValue:@"大師班" forKeyPath:@"student.subject"];
NSLog(@"%@",[person valueForKeyPath:@"student.subject"]);
複製代碼
假如字典的key和一個對象的屬性都同樣,那麼能夠經過setValuesForKeysWithDictionary直接將字典的value賦值給對象相應的屬性,一樣,也能夠經過dictionaryWithValuesForKeys將對象轉換成字典ui
- (void)dictionaryTest{
NSDictionary* dict = @{
@"name":@"Cooci",
@"nick":@"KC",
@"subject":@"iOS",
@"age":@18,
@"length":@180
};
LGStudent *p = [[LGStudent alloc] init];
// 字典轉模型
[p setValuesForKeysWithDictionary:dict];
NSLog(@"%@:%@",p,p.name);
// 鍵數組轉模型到字典
NSArray *array = @[@"name",@"age"];
NSDictionary *dic = [p dictionaryWithValuesForKeys:array];
NSLog(@"%@",dic);
}
複製代碼
經過api能夠拿到數組元素的長度,也能夠對數組元素進行操做獲得新的數組spa
NSArray *array = @[@"Hank",@"Cooci",@"Kody",@"CC"];
//獲得數組中全部元素的長度
NSArray *lenStr= [array valueForKeyPath:@"length"];
NSLog(@"%@",lenStr);
//將數組中全部值全變成小寫
NSArray *lowStr= [array valueForKeyPath:@"lowercaseString"];
NSLog(@"%@",lowStr);
//將數組中全部值全變成大寫
NSArray *uppercaseStr= [array valueForKeyPath:@"uppercaseString"];
NSLog(@"%@",uppercaseStr);
複製代碼
@avg:取平均值 @count:取個數 @max:取最大值 @min:取最小值 @sum:求和指針
- (void)aggregationOperator{
NSMutableArray *personArray = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
LGStudent *p = [LGStudent new];
NSDictionary* dict = @{
@"name":@"Tom",
@"age":@(18+i),
@"nick":@"Cat",
@"length":@(175 + 2*arc4random_uniform(6)),
};
[p setValuesForKeysWithDictionary:dict];
[personArray addObject:p];
}
NSLog(@"%@", [personArray valueForKey:@"length"]);
/// 平均身高
float avg = [[personArray valueForKeyPath:@"@avg.length"] floatValue];
NSLog(@"%f", avg);
int count = [[personArray valueForKeyPath:@"@count.length"] intValue];
NSLog(@"%d", count);
int sum = [[personArray valueForKeyPath:@"@sum.length"] intValue];
NSLog(@"%d", sum);
int max = [[personArray valueForKeyPath:@"@max.length"] intValue];
NSLog(@"%d", max);
int min = [[personArray valueForKeyPath:@"@min.length"] intValue];
NSLog(@"%d", min);
}
複製代碼
根據上面官方文檔得知:code
在開發中常常用用到kvc,須要注意的是,ios13之後,對部分私有屬性,使用kvc的話,會崩潰,這點要注意。