由於知識點比較簡單,這里不再陳述一大堆的原理,直入主題。
KVC中的集合運算符有以下三類:
1、簡單集合運算符:@avg、@sum、@max、@min、@count (只能用在集合對象中,對象屬性必須為數字類型)
2、對象操作符:
@unionOfObjects:返回指定屬性的值的數組,不去重
@distinctUnionOfObjects:返回指定屬性去重后的值的數組
3、數組 / 集體操作符:跟對象操作符很相似,只不過是在NSArray
和NSSet
所組成的集合中工作的。
@unionOfArrays:返回一個數組,值由各個子數組的元素組成,不去重
@distinctUnionOfArrays:返回一個數組,值由各個子數組的元素組成,去重
@distinctUnionOfSets:和@distinctUnionOfArrays差不多, 只是它期望的是一個包含着NSSet對象的NSSet,並且會返回一個NSSet對象。因為集合不能有重復的值,所以只有distinct操作。
上代碼:
場景:有一個Person類,有name和age兩個屬性。實例化5個對象,求其平均年齡、年齡總和、最大年齡和最小年齡。
Person類頭文件:
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 /** 6 姓名 7 */ 8 @property(nonatomic,copy) NSString *name; 9 10 /** 11 年齡 12 */ 13 @property(nonatomic,assign) NSInteger age; 14 15 /** 16 自定義構造函數 17 18 @param name 姓名 19 @param age 年齡 20 21 @return 返回Person的對象 22 */ 23 - (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age; 24 25 @end
Person的.m文件:
1 #import "Person.h" 2 3 @implementation Person 4 5 - (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age{ 6 if(self = [super init]){ 7 _name = name; 8 _age = age; 9 } 10 return self; 11 } 12 13 @end
控制器調用Person對象實現功能:
1 @interface ViewController () 2 3 @end 4 5 @implementation ViewController 6 7 - (void)viewDidLoad { 8 [super viewDidLoad]; 9 10 Person *p1 = [[Person alloc] initWithName:@"xiaoming" andAge:10]; 11 Person *p2 = [[Person alloc] initWithName:@"xiaoming" andAge:15]; 12 Person *p3 = [[Person alloc] initWithName:@"xiaohong" andAge:20]; 13 Person *p4 = [[Person alloc] initWithName:@"xiaoli" andAge:30]; 14 Person *p5 = [[Person alloc] initWithName:@"xiaoli" andAge:55]; 15 16 // 簡單集合運算符不能用在單個對象中,所以這里會報錯 17 // int res = [[p1 valueForKeyPath:@"@sum.age"] integerValue]; 18 19 NSArray *perArray = @[p1, p2, p3, p4, p5]; 20 21 // 簡單集合運算符 22 NSInteger avg = [[perArray valueForKeyPath:@"@avg.age"] integerValue]; 23 NSInteger sum = [[perArray valueForKeyPath:@"@sum.age"] integerValue]; 24 NSInteger max = [[perArray valueForKeyPath:@"@max.age"] integerValue]; 25 NSInteger min = [[perArray valueForKeyPath:@"@min.age"] integerValue]; 26 27 // count:取數組中元素的個數,下面 3 種寫法等價 28 NSInteger count = [[perArray valueForKeyPath:@"@count.age"] integerValue]; 29 NSInteger count1 = [[perArray valueForKeyPath:@"@count"] integerValue]; 30 NSInteger count2 = perArray.count; 31 32 33 // 對象操作符:對數組對象進行操作 34 // @unionOfObjects:返回指定屬性的值的數組,不去重 35 // @distinctUnionOfObjects:返回指定屬性去重后的值的數組 36 NSArray<NSString *> *nameArray = [perArray valueForKeyPath:@"@unionOfObjects.name"]; 37 NSArray<NSString *> *nameArray2 = [perArray valueForKeyPath:@"@distinctUnionOfObjects.name"]; 38 39 // 數組 / 集體操作符 : 對由NSArray和NSSet所組成的集合操作 40 // unionOfArrays:返回一個數組,值由各個子數組的元素組成,不去重 41 // distinctUnionOfArrays:返回一個數組,值由各個子數組的元素組成,去重 42 // distinctUnionOfSets:和distinctUnionOfArrays差不多, 只是它期望的是一個包含着NSSet對象的NSSet,並且會返回一個NSSet對象。因為集合不能包含重復的值,所以它只有distinct操作。 43 Person *P1 = [[Person alloc] initWithName:@"PP1" andAge:10]; 44 Person *P2 = [[Person alloc] initWithName:@"PP1" andAge:20]; 45 Person *P3 = [[Person alloc] initWithName:@"PP2" andAge:30]; 46 Person *P4 = [[Person alloc] initWithName:@"PP3" andAge:40]; 47 Person *P5 = [[Person alloc] initWithName:@"PP3" andAge:50]; 48 NSArray *perArray2 = @[P1, P2, P3, P4, P5]; 49 50 NSArray *arr1 = [@[perArray,perArray2] valueForKeyPath:@"@unionOfArrays.name"]; 51 NSArray *arr2 = [@[perArray,perArray2] valueForKeyPath:@"@distinctUnionOfArrays.name"]; 52 } 53 54 @end