美文网首页iOS Developer
KVC Collection Operators

KVC Collection Operators

作者: Gxpzy | 来源:发表于2016-08-25 14:33 被阅读43次

    在介绍集合操作符强大的功能前我们先来看一下它的格式要求


    1.png

    简单的集合操作符

    @avg 求均值

    @interface People : NSObject
    @property (nonatomic, copy) NSString *property;
    - (instancetype)initWithProperty:(NSString *)property;
    @end
    - (void)viewDidLoad {
        People *zhanSan = [[People alloc]initWithProperty:@"3.5"];
        [array addObject:zhanSan]; 
        People *liSi = [[People alloc]initWithProperty:@"4"];
        [array addObject:liSi];    
        NSNumber *averageMoney = [array valueForKeyPath:@"@avg.property"];//结果是3.75
    }
    

    这里做个说明
    Left key path 是可以省略的,一般情况下都省略
    这个例子中的集合操作符是@avg
    Right key path这里指定了是property财产这个属性,这一个是不可以省略的除了当使用@count时
    可能有人会提出疑问,property不是NSString类型的吗,怎么会计算除了均值呢,这里它会默认转换成double类型,而返回值是NSNumber类型的。
    留一个小练习:计算出一个数组中各元素的均值
    @count
    NSNumber *count = [array valueForKeyPath:@"@count"];//结果是2
    除此外还有@sum,@max,@min

    对象操作符

    @distinctUnionOfObjects

        NSArray *data = @[@"1", @"1", @"3"];
        NSNumber *count = [data valueForKey:@"@count"];
        NSArray *dataAfterOperation = [data valueForKeyPath:@"@distinctUnionOfObjects.self"];//结果是1,3
    

    这个操作符会删除掉重复的元素,是不是很方便啊
    @unionOfObjects

        NSArray *data = @[@"1", @"3", @"1"];
        NSNumber *count = [data valueForKey:@"@count"];
        NSArray *dataAfterOperation = [data valueForKeyPath:@"@unionOfObjects.self"];//结果是1,3,1
    

    这个操作不会去重,如数组中放了很多个People,而你只想获得这些人的名字的时候就可以用这个操作符了

    数组和集合操作符

    如果数组中嵌套了数组应该怎么办呢?
    @distinctUnionOfArrays

        NSMutableArray *array = [NSMutableArray new];
       
        NSMutableArray *array1 = [NSMutableArray new];
        
        People *zhanSan1 = [[People alloc]initWithProperty:@"3.5"];
        People *liSi1 = [[People alloc]initWithProperty:@"4"];
        [array1 addObject:zhanSan1];
        [array1 addObject:liSi1];
        
        NSMutableArray *array2 = [NSMutableArray new];
    
        People *zhanSan2 = [[People alloc]initWithProperty:@"5"];
        People *liSi2 = [[People alloc]initWithProperty:@"4"];
        [array2 addObject:zhanSan2];
        [array2 addObject:liSi2];
        
        [array addObject:array1];
        [array addObject:array2];
        
        NSArray *results= [array valueForKeyPath:@"@distinctUnionOfArrays.property"];//结果是3.5,4,5
    

    除此之外还有@unionOfArrays,@unionOfArrays,@distinctUnionOfSets
    推荐阅读
    KVC Collection Operators

    相关文章

      网友评论

        本文标题:KVC Collection Operators

        本文链接:https://www.haomeiwen.com/subject/lyaosttx.html