可能很多人對- (nullable id)valueForKeyPath:(NSString *)keyPath;這個(gè)方法不是很理解,實(shí)際上,這可以擴(kuò)展到 KVC 中的高級(jí)用法上去蟀拷。該方法非常強(qiáng)大硼被。
.valueForKeyPath 可以使用. 來一層一層向下索引,當(dāng)多個(gè)字典層級(jí)時(shí)朗和,取子層級(jí)中的屬性就非常簡單了
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"]);
相當(dāng)于數(shù)組中的每個(gè)成員執(zhí)行了uppercaseString方法,然后把返回的對象組成一個(gè)新數(shù)組返回簿晓。當(dāng)然眶拉,還有許多 NSString 的其他方法也可以,比如:
NSLog(@"%@",[array1 valueForKeyPath:@"length"]);
返回每個(gè)字符串長度的組成的數(shù)組憔儿。只要你能想到的成員實(shí)例方法都可以這么用忆植。是不是很爽!
當(dāng)然谒臼,還有許多其他高級(jí)功能朝刊,還是分別舉例說明:
對 NSNumber 數(shù)組快速計(jì)算數(shù)組求和、平均數(shù)屋休、最大值坞古、最小值
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);
可分別計(jì)算得到總和、平均值劫樟、最大值痪枫、最小值织堂。
當(dāng)然,也可以刪除重復(fù)的數(shù)據(jù):
NSArray*array3 = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
NSLog(@"%@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
對 NSDictionary 數(shù)組快速找出相應(yīng) key 對的值
NSArray*array4 = @[@{@"name":@"xiaoming", @"code":@1}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @{@"name":@"judy", @"code":@2},@{@"name":@"judy",@"code":@3}, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@{@"name":@"xiaohua",@"code":@4}];
NSLog(@"%@", [array4valueForKeyPath:@"name"]);
當(dāng)然奶陈,也可以嵌套使用(先刪除對應(yīng)值的重復(fù)數(shù)據(jù)再取值):
NSArray*array5 = @[@{@"name":@"xiaoming",? ? ? ? ? ? ? ? ? ? ? @"code":@1},? ? ? ? ? ? ? ? ? ? @{@"name":@"judy",? ? ? ? ? ? ? ? ? ? ? @"code":@2},? ? ? ? ? ? ? ? ? ? @{@"name":@"judy",? ? ? ? ? ? ? ? ? ? ? @"code":@3},? ? ? ? ? ? ? ? ? ? @{@"name":@"xiaohua",? ? ? ? ? ? ? ? ? ? ? @"code":@4}];
NSLog(@"%@", [array5valueForKeyPath:@"@distinctUnionOfObjects.name"]);
還有更高級(jí)的用法:改變 UITextfield 的 placeholder 的顏色
[myTextField setValue:[UIColor whiteColor] forKeyPath:@”_placeholderLabel.textColor”];