看到這篇文章 才知道valueForKeyPath
是這么用的赶掖。
????????????????????????????
什么一句話也可以實(shí)現(xiàn)遍歷效果8土选P碚省!
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:方法來(lái)確定最大值百揭。所以為了讓其正常工作,集合中所有的對(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:方法來(lái)確定最大值方仿。所以為了讓其正常工作,集合中所有的對(duì)象都必須支持和另一個(gè)對(duì)象的比較统翩。
@min: 和@max一樣仙蚜,但是返回的是集合中的最小值。
*/
//注:---> @
//KVC集合運(yùn)算符允許在valueForKeyPath:方法中使用key path符號(hào)在一個(gè)集合中執(zhí)行方法厂汗。無(wú)論什么時(shí)候你在key path中看見(jiàn)了@委粉,它都代表了一個(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é)果:
![簡(jiǎn)單集合操作符](http://upload-images.jianshu.io/upload_images/1599305-2543477be98d8c10.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#####對(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é)果:
![對(duì)象操作符](http://upload-images.jianshu.io/upload_images/1599305-5063d87616d26289.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#####數(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é)果:
![數(shù)組和集合操作符](http://upload-images.jianshu.io/upload_images/1599305-6a75ebddd2c1b221.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)