集合操作符
集合操作符是一个项目符号,它利用关键路径对集合中的元素进行操作。下面阐释有效的集合操作符,关键路径应用实例,以及他们产生的结果。
集合操作符是关键路径,它作为 valueForKeyPath:方法参数。操作符字符串以符号@为开头,关键路径集合在操作符的左边,数组和集合都适用于操作符,在操作符的右边是一个集合属性列表。
实例1 操作关键路径格式
除了@count操作符以外,都有一个集合属性列表在操作符的右边。
注意:目前是不支持自定义操作符的。
操作符返回结果有几种类型:
- 简单的操作符,返回字符串,数字或者日期,主要依靠右边的关键字(参考简单操作符)
- 对象操作符返回一个数组实例,参考对象操作符
- 数组和集合返回一个数组或者集合,参考数组和集合操作符
简单集合运算符
例子:Transactions对象数据
在数组或者集合中,简单集合运算符对运算左边的属性进行操作。
@avg
@avg操作符使用valueForKeyPath: 函数,以关键路径为参数,返回在操作位右边属性的平均值,类型为double,这个值被NSNumber包装。如果值为nil,将会以0替代。
NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];
transactionAverage is $456.54
@count
@count操作符返回在操作符左边的关键路径指定的对象的个数(NSNumber对象),操作符右边关键路径被忽略。
NSNumber *numberOfTransactions = [transactions valueForKeyPath:@"@count"];
numberOfTransactions is 13.
@max
@max操作符通过比较操作符右边指定的属性的值,来返回一个最大值。通过对象的compare:方法来比较 根据指定的关键路径来决定最大值。这个参与比较的对象的属性必须支持相互比较。如果操作符右边关键路径指定的值是nil,将会忽略。
NSDate *latestDate = [transactions valueForKeyPath:@"@max.date"];
latestDate is Jul 15, 2010
@min
NSDate *earliestDate = [transactions valueForKeyPath:@"@min.date"];
earliestDate is Dec 1, 2009
@sum
@sum返回操作符右边关键路径指定的属性的值的和,将每一个数值转成double类型,在计算值的和,其结果被包装在一个NSNumber对象中,如果操作符右边关键路径指定的值是nil,将被忽略.
NSNumber *amountSum = [transactions valueForKeyPath:@"@sum.amount"];
amountSum is $5,935.00.
对象操作符
@distinctUnionOfObjects
@distinctUnionOfObjects操作符根据操作符右边的关键路径指定的属性返回一个包含不同对象的数组。
NSArray *payees = [transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
payees数组包含字符串: Car Loan, General Cable, Animal Hospital, Green Power, Mortgage.
@unionOfObjects操作符和它类似,但是不会移除相同对象的副本。
注意:如果右关键路径的属性为nil,则会抛出一个异常。
数组和集合操作符
数组和集合操作符能在集合中嵌套操作,这个集合中的每一个元素也是一个集合。
arrayOfTransactions变量在每个操作符中都有使用。它是一个包含transaction对象的2个数组的数组。
// Create the array that contains additional arrays.
self.arrayOfTransactionsArray = [NSMutableArray array];
// Add the array of objects used in the above examples.
[arrayOfTransactionsArray addObject:transactions];
// Add a second array of objects; this array contains alternate values.
[arrayOfTransactionsArrays addObject:moreTransactions];
transaction包含上图中的数据,moreTransactions包含下图中的数据。
@distinctUnionOfArrays
@distinctUnionOfArrays操作符根据操作符右边的关键路径指定的属性返回一个包含不同对象的数组
NSArray *payees = [arrayOfTransactionsArrays valueForKeyPath:@"@distinctUnionOfArrays.payee"];
结果:payees数组包含下列值:Hobby Shop, Mortgage, Animal Hospital, Second Mortgage, Car Loan, General Cable - Cottage, General Cable, Green Power
@unionOfArrays和它类似,只是不移除副本。
注意:如果右关键路径的属性为nil,则会抛出一个异常。
@distinctUnionOfSets
@distinctUnionOfSets操作符返回一个包含不同对象的集合,根据操作符右边的关键路径指定的属性。
和@distinctUnionOfArrays类似,除了返回一个集合而不是数组。
@distinctUnionOfArrays