KVC

2020-12-30  本文已影响0人  一个栗

KVC应用场景有哪些

  1. 动态地取值和设值
  2. 利用KVC来访问、修改对象和字典之间的转换
  3. model和字典之间转换
  4. 实现高阶消息传递
    当对容器类(如NSArray)使用KVC时,valueForKey会被传递给容器中的每一个对象,而不是对容器本身进行操作,相应的结果会保存到返回的容器中,这也可以很方便地操作集合来返回另一个集合。示例代码如下:
NSArray *array = @[@"jack",@"join",@"tom"];
NSArray *result = [array valueForKey:@"capitalizedString"];
[result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"idx = %lu obj = %@",(unsigned long)idx,obj);
    }];

结果如下:

2020-12-31 20:08:13.247777+0800 test[9277:20927141] idx = 0 obj = Jack
2020-12-31 20:08:13.247948+0800 test[9277:20927141] idx = 1 obj = Join
2020-12-31 20:08:13.248076+0800 test[9277:20927141] idx = 2 obj = Tom

方法capitalizedString被传递给array中的每一项,每个成员都会执行,字符串第一个字母变成了大写。
需要注意的是,如果要执行多个方法,可以执行valueForKeyPath。

NSMutableDictionary的setValue和setObject有什么区别?

setValue: forKey:方法的API是

@interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)

/* Send -setObject:forKey: to the receiver, unless the value is nil, in which case send -removeObjectForKey:.
*/
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

@end

官方解释:当发送setValue: forKey:消息给NSMutableDictionary对象,一般情况下仍是调用了setObject: forKey:方法,除非参数value为nil时,会转而调用removeObjectForKey:清除这个键值对。
对应setObject: forKey:方法的API是:

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

需要注意的是,这里的aKey是一个遵守了NSCopying协议的id对象,并不是NSString类型字符串只不过实际中常使用NSString,示例代码:

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"1" forKey:[NSNumber numberWithInt:1]];
[dic setValue:@"2" forKey:[NSNumber numberWithInt:2]];
NSLog(@"value1 = %@ value2 = %@",dic[[NSNumber numberWithInt:1]],dic[[NSNumber numberWithInt:2]]);

结果如下:

2020-12-31 20:29:03.680761+0800 test[9351:20938483] value1 = 1 value2 = 2

setValue: forKey:的key是非字符串类型时,系统会警告,但是不会报错,可以正常运行。

综上所述,主要区别有:
1.setObject: forKey:方法是NSMutableDictionary特有的,只有NSMutableDictionary类及其子类的实例话对象能使用,而setValue: forKey:是KVC的主要方法,只要遵循了NSCopying协议的对象都能够使用。
2.setObject: forKey:参数value的值不能为nil,否则抛出异常,而setValue: forKey:中的value可以为nil,当value为nil时,会自动调用removeObjectForKey方法。
3.setValue: forKey:中的key只能是NSString类型,而setObject: forKey:key可以是任何类型的对象类型。

上一篇 下一篇

猜你喜欢

热点阅读