KVC集合操作符

作者: 闹鬼的金矿 | 来源:发表于2017-07-21 16:22 被阅读63次

第一次遇到是在阅读AFNetworking中NSURLSession部分代码的时候:

- (NSArray *)tasksForKeyPath:(NSString *)keyPath {
 
    __block NSArray *tasks = nil;
 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
 
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks,
     NSArray *uploadTasks, NSArray *downloadTasks) {
 
        if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))
        ]) {
 
            tasks = dataTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            uploadTasks))]) {
 
            tasks = uploadTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            downloadTasks))]) {
 
            tasks = downloadTasks;
 
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(
            tasks))]) {
             
            //dataTasks, uploadTasks, downloadTasks 都是数组,相当于打平数组,返回一个包含子数组各元素的数组。
            tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:
            @"@unionOfArrays.self"];
        }
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    return tasks;
 
}

KVC集合运算符允许以key path符号在一个集合中执行方法,以@开头表示一个特定的集合方法。键值编码会在必要的时候把基本数据类型进行装箱或者拆箱

它主要分为3类:1.简单集合操作符 2.对象操作符 3.数组和集合操作符

简单集合操作符

返回string,number等

@max/@min : 获得数组中最大(或者最小)的一个元素,元素内部要支持能够相互比较。这个好像只能是数值类型,系统并没有类似compare的方法,只有isEqual,但是并不是排序用的。

@avg : 将集合中对象转换成double类型,返回数组中指定的平均值的number对象

@sum :将集合中每个对象都转换成double类型,然后计算总和,最后返回一个值为这个总和的NSNumber对象

@count:返回集合中对象总数的NSNumber对象

例子:

[products valueForKeyPath:@"@count"];
[products valueForKeyPath:@"@sum.price"];
[products valueForKeyPath:@"@avg.price"];
[products valueForKeyPath:@"@max.price"];
[products valueForKeyPath:@"@min.launchedOn"];

对象操作符

@unionOfObjects/@distincUnionOfObjects 返回一个由操作符右边的key path指定的对象属性组成的数组,distincUnionOfObjects会对数组去重。

例子:

[inventory valueForKeyPath:@"@unionOfObjects.name"];
[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"];

数组和集合操作符

@distinctUnionOfArrays/@unionOfArrays 返回一个数组,其中包含这个这个数组中每个子数组对于这个操作符号右边指定的key path进行操作之后的值。

经常会使用 array unionOfArrays 来打平多维数组。

@distinctUnionOfSets 和@distinctUnionOfArrays类似,因为NSSet中是没有重复的值,所以只有distinct操作

利用这些操作,有时候可以避免无聊和重复的循环,代码也简洁了很多。

相关文章

  • iOS KVC Collection Operators(集合操

    KeyWords: KVC valueForKeyPath: KVC集合操作符的概念 引自官方文档When you...

  • KVC(三)

    接上: KVC(二) 接下来我们来看看 集合、集合操作符(集合作为属性)参考官网:Accessing Coll...

  • 了解 Key-Value Coding

    Key-Value Coding KVC的使用 对象属性的访问(基本类型、集合类型、集合操作符,(keyPath)...

  • KVC集合操作符

    第一次遇到是在阅读AFNetworking中NSURLSession部分代码的时候: KVC集合运算符允许以key...

  • KVC 集合操作符

    看到这篇文章 才知道valueForKeyPath是这么用的。...

  • KVC与KVO的进阶使用

    概述 本篇主要介绍键-值编码KVC,键值观察KVO的进阶使用的一些技巧主要是一下两个方面: KVC的集合操作符 K...

  • iOS KVC运用

    主要应用场景 KVC 属性赋值 添加和访问私有成员变量(ivar) 字典转模型 取值 模型转字典 集合操作符 自定...

  • iOS KVC进阶用法

    1. KVC字典操作 2. KVC消息传递 array 3. 聚合操作符 @avg、@count、@max、@...

  • KVC中的函数对集合进行操作

    集合操作符 对象操作符

  • Oracle SQL 学习笔记5 - 集合操作符

    什么是集合操作符 集合操作符将两个查询的结果组合成一个结果,常见集合操作符:MINUS(减去),INTERSECT...

网友评论

    本文标题:KVC集合操作符

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