IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【iOS】—— KVC -> 正文阅读

[移动开发]【iOS】—— KVC

KVC

KVC概念

KVC全称是Key-Value-Coding,键值编码,可以通过一个key来访问某个属性。

KVC基本API方法

- (nullable id)valueForKey:(NSString *)key;      //直接通过Key来取值

- (void)setValue:(nullable id)value forKey:(NSString *)key; //通过Key来设值

- (nullable id)valueForKeyPath:(NSString *)keyPath;   //通过KeyPath来取值

- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通过KeyPath来设值


在这里要注意的是前两种方法是KVC的设值,后两种方法是KVC的取值。

其他方法

// 默认返回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;

// 使用字典为Model赋值
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;

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


首先我们来看设值

设值

最简单的是用key方法直接设值:

Person* person = [[Person alloc]init];
 [person setValue:@namevalue forKey:@"name"];


还可以使用keyPath方法进行多重设值

Person* person = [[Person alloc]init];
[person setValue:@1 forKeyPath:@"dog.age"];

id age = [person valueForKeyPath:@"dog.age"];
NSLog(@"%@", age);

Dog类和Person类是两个继承NSObject的类,先在Person类里面设置Dog类型的属性,在Dog类里设置int类型的age属性,即可完成设值过程。

取值

在取值过程中,优先级是最重要的一点,一定要搞清楚KVC取值的优先级,我们可以先来看下图:

请添加图片描述
请添加图片描述

第一优先级

在这个过程中,第一优先级是getter方法,也就是说在取值的时候,先判断有没有getter方法,如果有的话直接取值成功,不需要后面的步骤了。

- (NSString*)name {
    return @"666";
}
- (NSString*)getName {
    return @"get666";
}
- (NSString*)isName {
    return @"is666";
}

我们在Person的m文件中把三个getter方法全写上,此时打印:

Person* person = [[Person alloc]init];
    NSString* name = [person valueForKey:@"name"];
    NSLog(@"%@", name);

在这里插入图片描述

我们发现在所有getter方法里面,优先级最高的是getName方法,然后我们把这个方法注释掉,经过实验得出结论:

在三个getter方法中,优先级排序:
getKey > key > isKey

第二优先级

我们发现上图中在第二优先级前面有一个方法,这个方法是什么呢,我们来看看:
在这里插入图片描述

+ (BOOL)accessInstanceVariablesDirectly

这个方法是BOOL类型,用来判断是否需要查找第二优先级,默认情况下为Yes,如果返回值改为No,就跳过查找第二优先级。

此时我们对成员变量通过重写init方法进行赋值:

- (instancetype)init {
    if (self = [super init]) {
        //成员变量
        _name = @"_name";
        _isName = @"_isName";
        name = @"name";
        isName = @"isName";
    }
    return self;
}

在进行第二级优先级测试的时候,先把第一优先级的方法注释起来,然后运行程序:
请添加图片描述

同样用刚才相同的方法进行测试,发现第二级方法的优先级:

_key > _iskey > key > iskey

那么如果两种情况都没有呢?

我们将代码都注释掉来试试:
在这里插入图片描述

这时候程序编译没问题,运行时就会报经典的Undefine问题了。

KVC问题其实是一个比较抽象的问题,如果文章难以理解的话,这里推荐一个视频博主,关于此节内容讲解十分细致:
KVC视频链接

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:08:24  更:2022-09-24 21:08:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 5:56:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码