小談KVC中KeyPath的集合運算符


由於知識點比較簡單,這里不再陳述一大堆的原理,直入主題。

KVC中的集合運算符有以下三類:

        1、簡單集合運算符:@avg、@sum、@max、@min、@count (只能用在集合對象中,對象屬性必須為數字類型)

    2、對象操作符:

               @unionOfObjects:返回指定屬性的值的數組,不去重

               @distinctUnionOfObjects:返回指定屬性去重后的值的數組

 

    3、數組 / 集體操作符:跟對象操作符很相似,只不過是在NSArrayNSSet所組成的集合中工作的。

               @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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM