1.objectForKey/valueForKey/valueForKeyPath區(qū)分
1.1. objectForKey是字典的方法,用來通過key取得字典的值.只有字典可以調(diào)用這個方法
1.2. valueForKey和valueForKeyPath是兩個KVC方法,所有的對象都可以調(diào)用,
valueForKey可以通過屬性名獲取到這個屬性的值,而valueForKeyPath則可以實現(xiàn)多級取值.
2.用處一
2.1. 對于@[@{key:value},@{key:value},@{key:value}]的數(shù)組(數(shù)組元素是字典的),
通過同一個key可以取到value的集合(數(shù)組)
例:
NSDictionary *dic1 = @{@"city":@"北京",@"count":@"22"};
NSDictionary *dic2 = @{@"city":@"上海",@"count":@"18"};
NSDictionary *dic3 = @{@"city":@"深圳",@"count":@"17"};
NSArray *arr = @[dic1,dic2,dic3];
輸出結(jié)果:
city:(
"北京",
"上海",
"深圳"
)
count:(
22,
18,
17
)
3.用處二
3.1. 可以計算平均值/求和等操作(簡單集合運算符分別為:@avg,@count,@max,@min,@sum)
例如:求 例2.1 中數(shù)組的算術(shù)操作(數(shù)組是對象的話,需要使用' @sum.count ',count為求值字段 )
NSLog(@"求和:%@",[arr valueForKeyPath:@"@sum.count"]);
NSLog(@"平均:%@",[arr valueForKeyPath:@"@avg.count"]);
NSLog(@"最大:%@",[arr valueForKeyPath:@"@max.count"]);
NSLog(@"最小:%@",[arr valueForKeyPath:@"@min.count"]);
輸出結(jié)果:
[15:29:27] -[LoginViewController Test] [第83行] 求和:57
[15:29:27] -[LoginViewController Test] [第84行] 平均:19
[15:29:27] -[LoginViewController Test] [第85行] 最大:22
[15:29:27] -[LoginViewController Test] [第86行] 最小:17
例如:數(shù)組是非對象,可以如下求值,floatValue為求值的類型
NSMutableArray *array = [NSMutableArray arrayWithObjects:@9,@"12",@15,@20,@"30", nil];
CGFloat maxValue = [[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat minValue = [[array valueForKeyPath:@"@min.floatValue"] floatValue];
輸出結(jié)果:
[16:22:55] -[LoginViewController Test] [第122行] 最大值=== 30.000000
[16:22:55] -[LoginViewController Test] [第122行] 最小值 === 9.000000
再或者如下:使用self求值默認為double類型數(shù)據(jù)
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"];
4.用處三
4.1. 對于@{key1:@{key2:vale}}的字典(字典的value是另一個字典),
通過key1.key2的鏈式的方式得到最深層的字典的值
例如:
NSDictionary *dict4 = @{@"name":@"小明",@"age":@"22"};
NSDictionary *dict5 = @{@"student":dict4};
NSDictionary *dict6 = @{@"class":dict5};
NSDictionary *dict7 = @{@"school":dict6};
NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.name"]);
NSLog(@"%@",[dict7 valueForKeyPath:@"school.class.student.age"]);
輸出結(jié)果:
[15:32:33] -[LoginViewController Test] [第93行] 小明
[15:32:33] -[LoginViewController Test] [第94行] 22
5.用處四
5.1. 不只是字典套字典,對象套對象/對象套對象再套字典等情況,都可以通過鏈式調(diào)用到深層的值
例如:
Student *student1 = [[Student alloc] init];
student1.name = @"小紅";
student1.info = @{@"phone":@"13102212345",@"mail":@"xiaohong@qq.com"};
School *school = [[School alloc] init];
school.student = student1;
NSLog(@"%@",[school valueForKeyPath:@"student.name"]);
NSLog(@"%@",[school valueForKeyPath:@"student.info.phone"]);
輸出結(jié)果:
2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 小紅
2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 13102212345
2016-08-03 15:21:38.259 ValueForKeyPath使用[5261:202278] xiaohong@qq.com
6.用處五
6.1. 可以快速刪除數(shù)組重復(fù)數(shù)據(jù)
例如:如果數(shù)組是非對象對局,使用的keypath為 ' @distinctUnionOfObjects.self '
NSArray *array3 = @[@"qq", @"wechat", @"qq", @"msn", @"wechat"];
NSLog(@"%@", [array3 valueForKeyPath:@"@distinctUnionOfObjects.self"]);
輸出結(jié)果:
[15:36:55] -[LoginViewController Test] [第97行] (
qq,
wechat,
msn
)
例如:數(shù)組是對象的數(shù)據(jù),使用的keypath為 ' @distinctUnionOfObjects.keys ',keys為去重的鍵值
NSArray *array = @[ @{@"title":@"zxp",@"name":@"zhangxiaoping"},
@{@"title":@"zxp2",@"name":@"zhangxiaoping2"},
@{@"title":@"zxp",@"name":@"zhangxiaoping3"}, @{@"title":@"zxp",@"name":@"zhangxiaoping"}];
//根據(jù)name字段,來進行重復(fù)刪除。
NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"];
//如果要根據(jù)title字段來刪除重名的寫法為`@distinctUnionOfObjects.title`
NSLog(@"%@", newArray);
輸出結(jié)果:
[15:42:37] -[LoginViewController Test] [第105行] (
zhangxiaoping3,
zhangxiaoping2,
zhangxiaoping
)
7.用處六
7.1. 可以進行示例方法的調(diào)用
NSArray *array = @[@"name", @"w", @"aa", @"ZXPing"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
輸出結(jié)果:
(
NAME,
W,
AA,
ZXPING
)
相當于數(shù)組中的每個成員執(zhí)行了uppercaseString方法,然后把返回的對象組成一個新數(shù)組返回。
既然可以用uppercaseString方法,那么NSString的其他方法也可以,
比如[array valueForKeyPath:@"length"]。當然,其他對象的實例方法也可以以此類推來進行調(diào)用~!