KVC Collection Operators(集合操作)
集合操作:一個集合/數組通過調用valueForKeyPath:
可允許一個集合中的對象屬性根據集合操作符做相應的操作。集合操作符是一個以@
開頭特殊的字符串,下面是集合操作的格式插圖(來自官方文檔):
注意:所有的集合操作,除了@count
,其他都需要有右邊的keyPath(一般爲屬性名),目前還不支持自定義集合操作符。
集合操作符分爲三種:
- 簡單的集合操作 返回NSString、NSNumber、NSDate
- 對象操作符 返回NSArray
- 數組或集合操作符 返回NSArray、NSSet
Simple Collection Operators(簡單的操作符)
- @avg 平均值
- @count 個數
- @max 最大值
- @min 最小值
- @sum 和
下面通過一個例子來了解簡單的操作符用法:
現在有一個學生類(Student),有一個身高(height)屬性
@interface Student : NSObject
/** 身高 */
@property (nonatomic, assign) float height;
@end
示例代碼:
// 創建6個學生對象
NSMutableArray *students = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
Student *student = [[Student alloc] init];
student.height = 1.6 + 0.04 * arc4random_uniform(4);
[students addObject:student];
}
// 平均身高
float avg = [[students valueForKeyPath:@"@avg.height"] floatValue];
// 身高總和
float sum = [[students valueForKeyPath:@"@sum.height"] floatValue];
// 最大值
float max = [[students valueForKeyPath:@"@max.height"] floatValue];
// 最小值
float min = [[students valueForKeyPath:@"@min.height"] floatValue];
// 個數
float count = [[students valueForKeyPath:@"@count"] floatValue];
NSLog(@"\n avg: %f\n sum: %f\n max :%f\n min :%f\n count :%f", avg, sum, max, min, count);
提示:你可以簡單地通過吧self作爲操作符後面的key path來獲取有NSNunber組成的數組或者集合的總值,例如[@[@(1), @(2), @(3)] valueForKeyPath:@”@max.self”] 來自Objective Sea
Object Operator (對象操作符)
- @distinctUnionOfObjects 返回一個由操作符右邊的key path所指定的對象屬性組成的數組,不對數組去重
- @unionOfObjects 返回一個由操作符右邊的key path所指定的對象屬性組成的數組,並對數組去重
示例代碼:
// 創建8個一班的學生對象
NSMutableArray *studentsOfClassOne = [NSMutableArray array];
for (int i = 0; i < 8; i++) {
Student *student = [[Student alloc] init];
student.height = 1.6 + 0.04 * arc4random_uniform(6);
[studentsOfClassOne addObject:student];
}
// 創建8個二班的學生對象
NSMutableArray *studentsOfClassTwo = [NSMutableArray array];
for (int i = 0; i < 8; i++) {
Student *student = [[Student alloc] init];
student.height = 1.6 + 0.01 * arc4random_uniform(6);
[studentsOfClassTwo addObject:student];
}
NSLog(@"一班的學生身高(不去重) :");
NSArray *resultsOne = [studentsOfClassOne valueForKeyPath:@"@unionOfObjects.height"];
[studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"];
for (id result in resultsOne) {
NSLog(@"%@ ", result);
}
NSLog(@"二班的學生身高(去重) :");
NSArray *resultsTwo = [studentsOfClassTwo valueForKeyPath:@"@distinctUnionOfObjects.height"];
for (id result in resultsTwo) {
NSLog(@"%@ ", result);
}
Array and Set Operators(數組和集合操作符)
- @distinctUnionOfArrays/ @unionOfArrays: 返回NSArray,distinct版本會對數組取重
- @distinctUnionOfSets: 返回一個NSSet對象,因爲集合不能包含重複的值,所以它只有distinct操作。
// 創建8個一班的學生對象
NSMutableArray *studentsOfClassOne = [NSMutableArray array];
for (int i = 0; i < 8; i++) {
Student *student = [[Student alloc] init];
student.height = 1.6 + 0.04 * arc4random_uniform(6);
[studentsOfClassOne addObject:student];
}
// 創建8個二班的學生對象
NSMutableArray *studentsOfClassTwo = [NSMutableArray array];
for (int i = 0; i < 8; i++) {
Student *student = [[Student alloc] init];
student.height = 1.6 + 0.01 * arc4random_uniform(6);
[studentsOfClassTwo addObject:student];
}
NSLog(@"一班的學生身高(不去重) :");
NSArray *resultsOne = [studentsOfClassOne valueForKeyPath:@"@unionOfObjects.height"];
[studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"];
for (id result in resultsOne) {
NSLog(@"%@ ", result);
}
NSLog(@"二班的學生身高(不去重) :");
NSArray *resultsTwo = [studentsOfClassTwo valueForKeyPath:@"@unionOfObjects.height"];
for (id result in resultsTwo) {
NSLog(@"%@ ", result);
}
NSLog(@"------------去重後------------");
// 去除相同值的數組
NSArray *distinctResults = [@[studentsOfClassOne, studentsOfClassTwo] valueForKeyPath:@"@distinctUnionOfArrays.height"];
NSLog(@"%@", distinctResults);
總結
KVC集合運算符是一個想節省幾行代碼並在這一過程中看起來很酷的人必須要了解的。如果想要有更深層次的瞭解,可以去看蘋果官方文檔Collection Operators