看到這篇文章 才知道valueForKeyPath
是這么用的。
????????????????????????????
什么一句話也可以實(shí)現(xiàn)遍歷效果?。?!
NSLog(@"學(xué)生集合平均分 = %@",[arr valueForKeyPath:@"@avg.score"]);
首先造一些測(cè)試數(shù)據(jù)、后面使用
-(NSArray *)loadData
{
//假數(shù)據(jù)
Student *stu0 = [[Student alloc]init];
stu0.stuId = 0;
stu0.name = @"tom";
stu0.score = 88;
Student *stu1 = [[Student alloc]init];
stu1.stuId = 1;
stu1.name = @"sam";
stu1.score = 90;
Student *stu2 = [[Student alloc]init];
stu2.stuId = 2;
stu2.name = @"xiaoming";
stu2.score = 65;
Student *stu3 = [[Student alloc]init];
stu3.stuId = 3;
stu3.name = @"shangsan";
stu3.score = 89;
//此學(xué)生和stu3同名
Student *stu4 = [[Student alloc]init];
stu4.stuId = 4;
stu4.name = @"shangsan";
stu4.score = 91;
return @[stu0,stu1,stu2,stu3,stu4];
}```
#####簡(jiǎn)單集合操作符
> `@count`: 返回一個(gè)值為集合中對(duì)象總數(shù)的NSNumber對(duì)象。
`@sum`: 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其總,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象。
`@avg`: 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其均分,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象。
`@max`: 使用compare:方法來確定最大值。所以為了讓其正常工作,集合中所有的對(duì)象都必須支持和另一個(gè)對(duì)象的比較。
`@min`: 和@max一樣,但是返回的是集合中的最小值。
//獲取學(xué)生數(shù)據(jù)
NSArray *arr = [self loadData];
/**
簡(jiǎn)單集合操作符
@count: 返回一個(gè)值為集合中對(duì)象總數(shù)的NSNumber對(duì)象。
@sum: 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其總,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象。
@avg: 首先把集合中的每個(gè)對(duì)象都轉(zhuǎn)換為double類型,然后計(jì)算其均分,最后返回一個(gè)值為這個(gè)總和的NSNumber對(duì)象。
@max: 使用compare:方法來確定最大值。所以為了讓其正常工作,集合中所有的對(duì)象都必須支持和另一個(gè)對(duì)象的比較。
@min: 和@max一樣,但是返回的是集合中的最小值。
*/
//注:---> @
//KVC集合運(yùn)算符允許在valueForKeyPath:方法中使用key path符號(hào)在一個(gè)集合中執(zhí)行方法。無論什么時(shí)候你在key path中看見了@,它都代表了一個(gè)特定的集合方法,其結(jié)果可以被返回或者鏈接,就像其他的key path一樣。
NSLog(@"學(xué)生集合平均分 = %@",[arr valueForKeyPath:@"@avg.score"]);
NSLog(@"學(xué)生集合總數(shù) = %@",[arr valueForKeyPath:@"@count"]);
NSLog(@"學(xué)生集合最該分 = %@",[arr valueForKeyPath:@"@max.score"]);
NSLog(@"學(xué)生集合最低分 = %@",[arr valueForKeyPath:@"@min.score"]);
NSLog(@"學(xué)生集合成績(jī)總和 = %@",[arr valueForKeyPath:@"@sum.score"]);
打印結(jié)果:

#####對(duì)象操作符
> `@unionOfObjects`/ `@distinctUnionOfObjects`: 返回一個(gè)由操作符右邊的key path所指定的對(duì)象屬性組成的數(shù)組。
其中:
`@distinctUnionOfObjects` 會(huì)對(duì)數(shù)組去重,
`@unionOfObjects` 不會(huì)對(duì)數(shù)組去重
/**
對(duì)象操作符
@unionOfObjects / @distinctUnionOfObjects: 返回一個(gè)由操作符右邊的key path所指定的對(duì)象屬性組成的數(shù)組。
其中:
@distinctUnionOfObjects 會(huì)對(duì)數(shù)組去重,
@unionOfObjects 不會(huì)對(duì)數(shù)組去重
*/
NSLog(@"%@",[arr valueForKeyPath:@"@unionOfObjects.name"]);
NSLog(@"%@",[arr valueForKeyPath:@"@distinctUnionOfObjects.name"]);
打印結(jié)果:

#####數(shù)組和集合操作符
> `@distinctUnionOfArrays` / `@unionOfArrays`: 返回了一個(gè)數(shù)組,其中包含這個(gè)集合中每個(gè)數(shù)組對(duì)于這個(gè)操作符右面指定的key path進(jìn)行操作之后的值。正如你期望的,distinct版本會(huì)移除重復(fù)的值。
`@distinctUnionOfSets`: 和`@distinctUnionOfArrays`差不多, 但是它期望的是一個(gè)包含著NSSet對(duì)象的NSSet,并且會(huì)返回一個(gè)NSSet對(duì)象。因?yàn)榧喜荒馨貜?fù)的值,所以它只有distinct操作。
/**
數(shù)組和集合操作符
@distinctUnionOfArrays / @unionOfArrays: 返回了一個(gè)數(shù)組,其中包含這個(gè)集合中每個(gè)數(shù)組對(duì)于這個(gè)操作符右面指定的key path進(jìn)行操作之后的值。正如你期望的,distinct版本會(huì)移除重復(fù)的值。
@distinctUnionOfSets: 和@distinctUnionOfArrays差不多, 但是它期望的是一個(gè)包含著NSSet對(duì)象的NSSet,并且會(huì)返回一個(gè)NSSet對(duì)象。因?yàn)榧喜荒馨貜?fù)的值,所以它只有distinct操作。
*/
NSArray *arr2 = [self loadData];
NSLog(@"%@",[@[arr,arr2] valueForKeyPath:@"@unionOfArrays.name"]);
打印結(jié)果:
