KVC

KVC 的 使用心得

KVC

KVC通过key访问设置属性 valueForkey 和 setValue:forKey,用法比较熟悉,这里不再讲述

NSKeyValueCoding

待补充

KVC集合运算符

简单的集合运算符

返回的是strings, number, 或者 dates

  • @count: 返回一个值为集合中对象总数的NSNumber对象。
  • @sum: 首先把集合中的每个对象都转换为double类型,然后计算其总,最后返回一个值为这个总和的NSNumber对象。
  • @avg: 把集合中的每个对象都转换为double类型,返回一个值为平均值的NSNumber对象。
  • @max: 使用compare:方法来确定最大值。所以为了让其正常工作,集合中所有的对象都必须支持和另一个对象的比较。
  • @min: 和@max一样,但是返回的是集合中的最小值。
1
2
3
4
5
6
7
8
9
10
11
@interface Product : NSObject
@property NSString *name;
@property double price;
@property NSDate *launchedOn;
@end
[products valueForKeyPath:@"@count"]; // 4
[products valueForKeyPath:@"@sum.price"]; // 3526.00
[products valueForKeyPath:@"@avg.price"]; // 881.50
[products valueForKeyPath:@"@max.price"]; // 1699.00
[products valueForKeyPath:@"@min.launchedOn"]; // June 11, 2012

对象运算符

返回的是一个数组

  • @unionOfObjects / @distinctUnionOfObjects: 返回一个由操作符右边的key path所指定的对象属性组成的数组。其中@distinctUnionOfObjects 会对数组去重, 而且 @unionOfObjects 不会.

数组和集合运算符 返回的是一个数组或者集合

  • @distinctUnionOfArrays / @unionOfArrays: 返回了一个数组,其中包含这个集合中每个数组对于这个操作符右面指定的key path进行操作之后的值。正如你期望的,distinct版本会移除重复的值。

  • @distinctUnionOfSets: 和@distinctUnionOfArrays差不多, 但是它期望的是一个包含着NSSet对象的NSSet,并且会返回一个NSSet对象。因为集合不能包含重复的值,所以它只有distinct操作。

1
2
3
NSArray *inventory = @[iPhone5, iPhone5, iPhone5, iPadMini, macBookPro, macBookPro];
[inventory valueForKeyPath:@"@unionOfObjects.name"]; // "iPhone 5", "iPhone 5", "iPhone 5", "iPad Mini", "MacBook Pro", "MacBook Pro"
[inventory valueForKeyPath:@"@distinctUnionOfObjects.name"]; // "iPhone 5", "iPad Mini", "MacBook Pro"

swizzles KVC

官方文档说 KVC目前还不能自定义集合操作符

1
NSArray *names = [allEmployees valueForKeyPath: @"[collect].{daysOff<10}.name"];

参考

http://nshipster.cn/kvc-collection-operators/