一. KVC名词解释
KVC(key-value coding)键值编码,是指在iOS开发中开发者可以在运行时动态地通过key值去设置和访问对象的属性的一种方法。由于它是一种基于运行时的编程方式而不是在编译时,所以被很多开发者惯称为iOS开发中的黑魔法之一。
二.KVC最重要的四个方法:
1. (void)setValue:(nullable id)value forKey:(NSString *)key;//通过Key来设值
2. (nullable id)valueForKey:(NSString *)key;//通过Key来取值
3. (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;//通过KeyPath来设值
4. (nullable id)valueForKeyPath:(NSString *)keyPath;//通过KeyPath来取值
三.KVC的使用
- KVC设值 :见👆方法1。(执行顺序:setKey->_key->_iskey->key->isKey)
- KVC取值 :见👆方法2。 (执行顺序:getKey->_key->_isKey->key->isKey)
- KVC使用keyPath:见👆方法3和4。(主要针对那种需要多次KVC的情况,比如一个类的属性是一个自定义类或者一个复杂数据类型,那么对这个自定义类的属性或者数据类型的属性进行赋值取值操作时,就不用再使用两次KVC了,直接通过路径KeyPath寻找key。)
- KVC处理异常 :常见情况是用了错误的key,或者就是对非对象类型(比如值类型)赋值nil。这时候首先要保证避免这种情况的发生,再有就是最好重写setValueForUndefinedKey:和setNilValueForKey:方法
- KVC处理数值和结构体类型属性:valueForKey:会自动将值类型封装成对象,但是setValue:forKey:却不行。必须手动将值类型转换成NSNumber或者把结构体转换成NSValue类型,否则就会直接抛出异常。
- KVC键值验证(Key-Value Validation):一般情况下, 这个验证KVC不会主动调用,需要开发者手动去添加,也算是给了我们开发者一次纠错的机会。
- (BOOL)validateValue:(inoutid*)ioValue forKey:(NSString*)inKey error:(outNSError**)outError;
- KVC处理集合:简单集合运算符(@avg, @count , @max , @min ,@sum)和对象运算符(返回数组:@distinctUnionOfObjects去重后的数组@unionOfObjects未去重的数组)
- KVC处理字典
KVC里面还有两个关于NSDictionary的方法:
dictionaryWithValuesForKeys:是指输入一组key,返回这组key对应的属性,再组成一个字典。
setValuesForKeysWithDictionary是用来修改Model中对应key的属性。
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;