zoukankan      html  css  js  c++  java
  • 小谈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
  • 相关阅读:
    利用快慢指针快速得到链表中间节点
    idea编译golang插件总结
    Jquery复习(二)之stop()易忘点
    Jquery复习(一)之animate()易忘点
    doT学习(三)之实战
    doT学习(二)之用法集合
    doT学习(一)之语法
    npm学习(十二)之高级用法
    npm学习(十一)之package-lock.json
    npm学习(十)之如何使用创建、发布、使用作用域包
  • 原文地址:https://www.cnblogs.com/panda1024/p/6014399.html
Copyright © 2011-2022 走看看