可能很多人对- (nullable id)valueForKeyPath:(NSString *)keyPath;这个方法不是很理解,实际上,这可以扩展到 KVC 中的高级用法上去。该方法非常强大。
valueForKeyPath 可以使用. 来一层一层向下索引,当多个字典层级时,取子层级中的属性就非常简单了
NSDictionary*dict1=@{@"dic1":@{@"dic2":@{@"name":@"lisi",@"info":@{@"age":@"12"}}}};
id res = [dict1 valueForKeyPath:@"dict1.dict2.name"];
NSArray*array1 = @[@"xiaoming", @"xiaohua", @"zhangshan", @"lisi"];
NSLog(@"%@", [array1 valueForKeyPath:@"uppercaseString"]);
相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。当然,还有许多 NSString 的其他方法也可以,比如:
NSLog(@"%@",[array1 valueForKeyPath:@"length"]);
返回每个字符串长度的组成的数组。只要你能想到的成员实例方法都可以这么用。是不是很爽!
当然,还有许多其他高级功能,还是分别举例说明:
对 NSNumber 数组快速计算数组求和、平均数、最大值、最小值
NSArray*array2=@[@0,@2,@3,@4,@7];
NSNumber*sum= [array2 valueForKeyPath:@"@sum.self"];
NSNumber*avg= [array2 valueForKeyPath:@"@avg.self"];
NSNumber*max= [array2 valueForKeyPath:@"@max.self"];
NSNumber*min= [array2 valueForKeyPath:@"@min.self"];
NSLog(@"%@%@%@%@",sum,avg,max,min);
可分别计算得到总和、平均值、最大值、最小值。
当然,也可以删除重复的数据:
NSArray*array3 = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
NSLog(@"%@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
对 NSDictionary 数组快速找出相应 key 对的值
NSArray*array4 = @[@{@"name":@"xiaoming", @"code":@1}, @{@"name":@"judy", @"code":@2},@{@"name":@"judy",@"code":@3}, @{@"name":@"xiaohua",@"code":@4}];
NSLog(@"%@", [array4valueForKeyPath:@"name"]);
当然,也可以嵌套使用(先删除对应值的重复数据再取值):
NSArray*array5 = @[@{@"name":@"xiaoming", @"code":@1}, @{@"name":@"judy", @"code":@2}, @{@"name":@"judy", @"code":@3}, @{@"name":@"xiaohua", @"code":@4}];
NSLog(@"%@", [array5valueForKeyPath:@"@distinctUnionOfObjects.name"]);
还有更高级的用法:改变 UITextfield 的 placeholder 的颜色
[myTextField setValue:[UIColor whiteColor] forKeyPath:@”_placeholderLabel.textColor”];
KVC在数组的使用
KVC使用键路径查询数组,会查询数组中每一个对象的来查找这个键。
先定义一个ClassIOS24类
#import
@interface ClassIOS24 : NSObject
@property (nonatomic,weak) NSMutableArray *studentMArray;
@end
在定义一个学生类
#import
@interface Student : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
在主函数中
ClassIOS24 *studentClass = [ClassIOS24 new];
NSMutableArray *marray = [NSMutableArray array];
for (int i = 0; i<5; i++) {
NSString *name = [NSString stringWithFormat:@"%da",i];
Student *student = [Student new];
student.name = name;
student.age = 18*i;
[marray addObject:student];
// [studentClass.studentMArray addObject:student];
/*
不能直接使用[studentClass.studentMArray addObject:student];
用init初始化出来一个studentClass对象,为nil对象,所以nil对象的studentMArray是不存在的也还是nil,无法向nil中添加数组元素。
*/
}
studentClass.studentMArray = marray;
//KVC返回数组中的所有name
NSArray *nameArray = [studentClass valueForKeyPath:@"studentMArray.name"];
/*
此方法不行:
NSArray *ageArray = [studentClass valueForKey:@"studentMArray.name"];
下面的方法能把studentClass.studentMArray变量中所有的name变量设置为name。
[studentClass setValue:@"name" forKeyPath:@"studentMArray.name"];
*/
for (Student *obj in nameArray) {
NSLog(@"%@",obj);
}