OC:跟随小码哥一起学习KVC

简介: KVC 全拼 key-value-coding,翻译过来即为 键值编码 。可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的

本片文章主要讲解,KVC的实现原理、注意细节、实际应用:

KVC原理、KVC赋值和取值,KVC的key、keyPath注意点、KVC的集合处理、数模转换。


这里先创建两个对象,用于下面的举例应用


#import


@interface Author : NSObject{
    NSString *_name;
    //作者出版的书籍,一个作者对应多个书籍对象
    NSArray *_issueBook;
}
@end
//---------------------
#import "Author.h"
@implementation Author
@end


#import <Foundation/Foundation.h>
#import "Author.h"
@interface Book : NSObject{
    Author *_author;
}
//名字
@property(nonatomic,copy) NSString *name;
///价格
@property(nonatomic,assign)float price;
@end
//---------------------
#import "Book.h"
@implementation Book
@end


1、KVC原理

首先,两张图带你去了解,KVC的赋值和取值的原理:

7002d29614e540f68a88c75f3f73c18f.png

1.1、setValue:forKey:的赋值原理


accessInstanceVariablesDirectly方法的默认返回值是YES,如下:
+ (BOOL)accessInstanceVariablesDirectly {
    return YES;
}

1.2、valueForKey:的取值原理

834aeca830b347188b452577267f8e27.png


2、KVC赋值

通过键值路径为对象的属性赋值。一般用于私有的属性赋值:


 

//----------    KVC键值编码    --------
    Author *author = [[Author alloc] init];
    //设置属性值
    [author setValue:@"莫言" forKey:@"name"];

如果对象A中的属性含有是一个对象B,设置对象B的属性必须使用 forKeyPath 方法:


 

//-------   KVC设置作者的书籍数组   -------
    //键值路径:对于一个类中有数组对象的属性进行便捷操作
    Book *book1 = [[Book alloc] init];
    book1.name = @"红高粱";
    book1.price = 9;
    Book *book2 = [[Book alloc] init];
    book2.name = @"蛙";
    book2.price = 6;
    NSArray *array = [NSArray arrayWithObjects:book1,book2, nil];
    [author setValue:array forKeyPath:@"issueBook"];

3、KVC取值与集合处理


通过键值路径获取属性的值。一般通过key值获得私有属性的值。


//获取属性值
    NSString *name = [author valueForKey:@"name"];
    NSLog(@"%@",name);


可以通过keypath获得值:


 

// -----    KVC中键值路径取值   -------
    //基本数据类型会自动被包装成NSNumber,装到数组中
    //得到所有书籍的价格
    NSArray *priceArray = [author valueForKeyPath:@"issueBook.price"];
    NSLog(@"%@",priceArray);
    //获取数组的大小
    NSNumber *count = [author valueForKeyPath:@"issueBook.@count"];
    NSLog(@"count=%@",count);
    //获取书籍价格的总和
    NSNumber *sum = [author valueForKeyPath:@"issueBook.@sum.price"];
    NSLog(@"%@",sum);
    //获取书籍的平均值
    NSNumber *avg = [author valueForKeyPath:@"issueBook.@avg.price"];
    NSLog(@"%@",avg);
    //获取书籍的价格最大值和最小值
    NSNumber *max = [author valueForKeyPath:@"issueBook.@max.price"];
    NSNumber *min = [author valueForKeyPath:@"issueBook.@min.price"];
    NSLog(@"%@____%@",max,min);

20180823111931286.png

4、Key 与 KeyPath 的区别


1、赋值 setValue:forKey: 方法,取值 valueForKey: 方法

Key:键值,只能赋值当前层访问当前层。


2、赋值 setValue:forKeyPath: 方法,取值 valueForKeyPath:方法

KeyPath:键值路径,可以多层赋值多层访问。


5、模型转换


将字典转型成Model,方法:setValuesForKeysWithDictionary:


///数模转换
-(void)dicToModel{
    // 定义一个字典
    NSDictionary *dict = @{
                           @"name"  : @"rattan",
                           @"price" : @"88.66",
                           };
    // 创建模型
    Book *p = [[Book alloc] init];
    // 字典转模型
    [p setValuesForKeysWithDictionary:dict];
    NSLog(@"\n作者:%@\n价格:%.2lf",p.name,(float)p.price);
}


打印结果:

20180823111526296.png

注意:字典的key和Model的属性必须一一对应。 否则系统会报错如下:

‘[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.’


相关文章
uniapp上传文件时用到的api是什么?格式是什么?
uniapp上传文件时用到的api是什么?格式是什么?
|
API iOS开发
彻底搞懂同步与异步,阻塞/非阻塞
彻底搞懂同步与异步,阻塞/非阻塞
3723 0
|
4月前
|
缓存 前端开发 安全
什么是跨域?一文彻底搞懂 CORS 机制
本文深入解析Web开发中的跨域问题,涵盖同源策略、CORS原理、简单请求与预检请求机制,以及前后端配置方法,帮助开发者理解并解决常见的CORS错误,安全实现跨域资源共享。
|
人工智能 Ubuntu Linux
我的工具库-2025
从2008年编写第一行代码起,我经历了多阶段的知识管理探索。初期使用草稿本和待办事项,后转为离线笔记软件、个人博客与印象笔记,最终在2023年选定Obsidian作为核心工具,结合卡片式笔记法和双链笔记,实现高效的知识收集、加工与分享。我的日常工具涵盖开发环境(如JetBrains系列)、操作系统(Ubuntu)、NAS系统(TrueNAS Scale)及各类辅助应用,形成了一个高度定制化的“外部大脑”。这一套工具不仅支持了我的工作和学习,也让我深刻体会到AI时代的便利与无限可能。
我的工具库-2025
|
消息中间件 缓存 NoSQL
Redis原理—5.性能和使用总结
本文详细探讨了Redis的阻塞原因、性能优化、缓存相关问题及数据库与缓存的一致性问题。同时还列举了不同缓存操作方案下的并发情况,帮助读者理解并选择合适的缓存管理策略。最终得出结论,在实际应用中应尽量采用“先更新数据库再删除缓存”的方案,并结合异步重试机制来保证数据的一致性和系统的高性能。
Redis原理—5.性能和使用总结
|
人工智能 安全 API
Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
本文介绍了如何解决Deepseek官网卡顿问题,并详细讲解了阿里云提供的Deepseek-R1满血版解决方案。新用户可领取100万token,支持网页版和API调用。文中还提供了在Chatbox和Cursor中配置API的具体步骤,帮助用户轻松体验高性能的Deepseek-R1模型。适合初学者和开发者快速上手使用。
1121 2
Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
|
安全 网络协议 网络安全
无需花钱!教你申请免费 IP 地址 SSL 证书的完整指南
为IP地址配置SSL证书较为复杂,因大多数免费SSL证书仅支持域名验证,而不支持IP地址。SSL证书基于域名进行身份验证,而IP地址缺乏类似机制。通常,免费证书提供商如Let&#39;s Encrypt不支持IP地址,但JoySSL提供针对IP地址的免费试用SSL证书服务。用户需访问JoySSL官网注册并填写特定注册码230922获取资格,后续按提示提交申请并验证IP地址所有权。审核通过后可获得证书。JoySSL还提供多样化的证书选择、简便申请流程和优质技术支持,满足不同需求。
|
搜索推荐 安全 API
|
缓存 安全 前端开发
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?
本文首发于微信公众号“前端徐徐”,详细探讨了 Electron 应用在 macOS 平台上的更新原理。文章分析了 `MacUpdater` 类的实现,包括与 Electron 原生更新器的集成、更新检测和下载、代理服务器管理、环境适配、安全性保障、错误处理和日志记录、更新安装流程控制以及缓存管理等关键功能。通过这些技术细节,展示了如何在 macOS 上实现高效、安全的 Electron 应用更新。
615 0
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?