KVC 键值编码
一、KVC 介绍
KVC(Key-valuecoding)键值编码,就是指 iOS 的开发中,可以允许开发者通过 Key 名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性,而不是在编译时确定。
二、常见方法:
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
// KVC 设置 nil 值时会调用该方法,该方法默认抛出异常。重写该方法。
- (void)setNilValueForKey:(NSString *)key {
}
// KVC Key 不存在时会调用一下对应方法,该方法默认抛出异常。重写该方法。
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
}
- (id)valueForUndefinedKey:(NSString *)key {
return nil;
}
注意:keyPath:为 self、对象属性、对象属性的属性、字典key。
三、简单集合操作符
@count: 返回一个值为集合中对象总数的NSNumber对象。
@sum: 首先把集合中的每个对象都转换为double类型,然后计算其总,最后返回一个值为这个总和的NSNumber对象。
@avg: 把集合中的每个对象都转换为double类型,返回一个值为平均值的NSNumber对象。
@max: 使用compare:方法来确定最大值。所以为了让其正常工作,集合中所有的对象都必须支持和另一个对象的比较。
@min: 和@max一样,但是返回的是集合中的最小值。
🌰
[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 不会.
🌰
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"
五、特殊集合操作符
被操作的集合的元素必须是集合。
@distinctUnionOfArrays / @unionOfArrays:返回了一个数组,其中包含这个集合中每个数组对于这个操作符右面指定的 key path 进行操作之后的值。正如你期望的,distinct版本会移除重复的值。
@distinctUnionOfSets:返回了一个集合,其中包含这个集合中每个数组对于这个操作符右面指定的 key path 进行操作之后的值。因为集合不能包含重复的值,所以它只有distinct操作。

浙公网安备 33010602011771号