KVC
KVC简介
键值编码是NSKeyValueCoding非正式协议支持的一种机制,对象采用这种机制来提供对其属性的间接访问。当对象符合键值编码时,可以通过简洁、统一的消息传递接口使用字符串参数来访问其属性。这种间接访问机制补充了实例变量及其关联的访问器方法提供的直接访问。当对象从NSObject继承(直接或间接)时,它们通常采用键值编码,该对象既采用NSKeyValueCoding协议,又为基本方法提供默认实现。
键值编码是许多其他Cocoa技术的基础概念,例如键值观察,Cocoa绑定,Core Data和AppleScript-ability。在某些情况下,键值编码还可以帮助简化代码。
一、键值编码基础
1.1 访问对象属性
通过key或keyPath访问对象属性。key必须使用ASCII编码,不能包含空格,并且通常以小写字母开头。在Swift中,可以使用#keyPath表达式来代替使用字符串来表示key或keyPath,这提供了编译时检查的优势。
@interface BankAccount : NSObject
@property (nonatomic) NSNumber* currentBalance; // An attribute
@property (nonatomic) Person* owner; // A to-one relation
@property (nonatomic) NSArray< Transaction* >* transactions; // A to-many relation
@end
[myAccount setValue:@(100.0) forKey:@"currentBalance"];
//返回相对于接收者的键数组的值。该方法为数组中的每个键调用valueForKey:。返回的NSDictionary包含数组中所有键的值。
[myAccount dictionaryWithValuesForKeys:@"transactions"];
注意: 集合对象(例如NSArray,NSSet和NSDictionary)不能包含nil作为值,而是使用NSNull对象表示nil值。 NSNull提供了一个表示对象属性的nil值的实例。 dictionaryWithValuesForKeys:和相关的setValuesForKeysWithDictionary:的默认实现自动在NSNull(在dictionary参数中)和nil(在存储的属性中)之间转换。
1.2 访问集合属性
可以使用valueForKey:和setValue:forKey :(或它们的等效键路径)一样,获取或设置集合对象,但是,当您要操纵这些集合的内容时,通常使用协议定义的可变代理方法最有效。
- mutableArrayValueForKey:和mutableArrayValueForKeyPath:
它们返回行为类似于NSMutableArray对象的代理对象。 - mutableSetValueForKey:和mutableSetValueForKeyPath:
它们返回行为类似于NSMutableSet对象的代理对象。 - mutableOrderedSetValueForKey:和 mutableOrderedSetValueForKeyPath:
它们返回行为类似于NSMutableOrderedSet对象的代理对象。
1.3 使用集合运算符
- 聚合运算符:@avg、@count、@max、@min、@sum
聚合运算符处理数组或一组属性,产生一个反映集合某些方面的值。
NSNumber *amountSum = [self.transactions valueForKeyPath