iOS KVC

2021-04-04  本文已影响0人  学不来的凡人

KVC的全称是Key-Value Coding,翻译成中文是 键值编码,键值编码是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议来间接访问其属性。既可以通过一个字符串key来访问某个属性。这种间接访问机制补充了实例变量及其相关的访问器方法所提供的直接访问。

取值与设值

//通过setValue中key来设值
 - (void)setValue:(nullable id)value forKey:(NSString *)key;
 //通过valueForKey中key来取值
 - (nullable id)valueForKey:(NSString *)key;
 
 //通过valueForKeyPath中keyPath来设置值
 - (nullable id)valueForKeyPath:(NSString *)keyPath;
 //keyPath来取值
 - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;

其他API

/默认返回YES,表示如果没有找到Set<Key>方法的话,会按照_key,_iskey,key,iskey的顺序搜索成员,设置成NO就不这样搜索
+ (BOOL)accessInstanceVariablesDirectly;

//KVC提供属性值正确性验证的API,它可以用来检查set的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

//这是集合操作的API,里面还有一系列这样的API,如果属性是一个NSMutableArray,那么可以用这个方法来返回。
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;

//如果Key不存在,且KVC无法搜索到任何和Key有关的字段或者属性,则会调用这个方法,默认是抛出异常。
- (nullable id)valueForUndefinedKey:(NSString *)key;

//和上一个方法一样,但这个方法是设值。
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;

//如果你在SetValue方法时面给Value传nil,则会调用这个方法
- (void)setNilValueForKey:(NSString *)key;

//输入一组key,返回该组key对应的Value,再转成字典返回,用于将Model转到字典。
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;

setValue:forKey: 设置值步骤

KVC取值valueForKey:操作流程如下:

image.png

KVC 使用场景

//字典转模型
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
//模型转字典
- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
//KVC实现高阶消息传递
- (void)transmitMsg{
    NSArray *arrStr = @[@"english", @"franch", @"chinese"];
    NSArray *arrCapStr = [arrStr valueForKey:@"capitalizedString"];//capitalizedString 字符串首字母大写
    for (NSString *str in arrCapStr) {
        NSLog(@"%@", str);
    }
    NSArray *arrCapStrLength = [arrCapStr valueForKeyPath:@"capitalizedString.length"];
    for (NSNumber *length in arrCapStrLength) {
        NSLog(@"%ld", (long)length.integerValue);
    }
}
2021-04-02 15:56:06.908643+0800 IOS--多继承[7368:229757] English
2021-04-02 15:56:06.908789+0800 IOS--多继承[7368:229757] Franch
2021-04-02 15:56:06.908911+0800 IOS--多继承[7368:229757] Chinese
2021-04-02 15:56:06.909082+0800 IOS--多继承[7368:229757] 7
2021-04-02 15:56:06.909223+0800 IOS--多继承[7368:229757] 6
2021-04-02 15:56:06.909361+0800 IOS--多继承[7368:229757] 7
上一篇下一篇

猜你喜欢

热点阅读