可能你们对- (id)valueForKeyPath:(NSString *)keyPath
方法不是很了解。
其实这个方法很是的强大,举个例子:数组
NSArray *array = @[@"name", @"w", @"aa", @"jimsa"]; NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
输出code
( NAME, W, AA, JIMSA )
至关于数组中的每一个成员执行了uppercaseString
方法,而后把返回的对象组成一个新数组返回。既然能够用uppercaseString
方法,那么NSString的其余方法也能够,好比对象
[array valueForKeyPath:@"length"]
返回每一个字符串长度的组成的数组。只要你能想到的成员实例方法均可以这么用。字符串
若是你以为这个方法就这么点功能,那就错了。仍是举具体的例子it
NSArray *array = @[@1, @2, @3, @4, @10]; NSNumber *sum = [array valueForKeyPath:@"@sum.self"]; NSNumber *avg = [array valueForKeyPath:@"@avg.self"]; NSNumber *max = [array valueForKeyPath:@"@max.self"]; NSNumber *min = [array valueForKeyPath:@"@min.self"];
或者指定输出类型io
NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"]; NSNumber *avg = [array valueForKeyPath:@"@avg.floatValue"]; NSNumber *max = [array valueForKeyPath:@"@max.floatValue"]; NSNumber *min = [array valueForKeyPath:@"@min.floatValue"];
NSArray *array = @[@"name", @"w", @"aa", @"jimsa", @"aa"]; NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);
(
name,
w,
jimsa,
aa
)循环
NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1}, @{@"name": @"jim",@"code" : @2}, @{@"name": @"jim",@"code" : @1}, @{@"name": @"jbos",@"code" : @1}]; NSLog(@"%@", [array valueForKeyPath:@"name"]);
直接获得字典中name
key对应的值组成的数组,显然比循环取值再加入到新数组中方便快捷float
( cookeee, jim, jim, jbos )
一样能够嵌套使用,先剔除name
对应值的重复数据再取值nio
NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1}, @{@"name": @"jim",@"code" : @2}, @{@"name": @"jim",@"code" : @1}, @{@"name": @"jbos",@"code" : @1}]; NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.name"]);
打印
(
cookeee,
jim,
jbos
)方法
[searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
比起重写- (void)drawPlaceholderInRect:(CGRect)rect;
要方便不少