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

本文详细介绍了KVC(Key-Value Coding)的概念,包括setValue:forKey:和valueForKey:的工作原理,以及如何使用KVC进行属性赋值和取值。通过实例展示了如何通过键值路径处理数组属性,并探讨了Key与KeyPath的区别。此外,还讨论了模型转换的方法setValuesForKeysWithDictionary:,并提供了字典转模型的示例。文章强调了良好的代码可读性和易理解性的重要性。

请添加图片描述

✅作者简介:大家好我是瓜子三百克,一个非科班出身的技术程序员,还是喜欢在学习和开发中记录笔记的博主小白!
📃个人主页:瓜子三百克的主页
🔥系列专栏:OC语法
🤟格言:作为一个程序员都应该认识到,好的代码是初级工程师都可以理解的代码, 伟大的代码是可以被学习一年计算机专业的新生所理解。同时,作为自己记录一篇篇行文,不仅仅是给未来的自己温故知新,还要努力让每个小白都看得懂,践行的起来,方显每一篇笔记的强大。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
作者请求:由于博主水平有限,难免会有错误和不准之处,希望各位小伙伴能够在留言区批评斧正。


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

本片文章主要讲解,KVC的实现原理、注意细节、实际应用:
KVC原理、KVC赋值和取值,KVC的key、keyPath注意点、KVC的集合处理、数模转换。

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

#import <Foundation/Foundation.h>

@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的赋值和取值的原理:

1.1、setValue:forKey:的赋值原理

在这里插入图片描述
accessInstanceVariablesDirectly方法的默认返回值是YES,如下:

+ (BOOL)accessInstanceVariablesDirectly {
    return YES;
}

1.2、valueForKey:的取值原理

在这里插入图片描述

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);

图一

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);
}

打印结果:
图二

注意字典的key和Model的属性必须一一对应。 否则系统会报错如下:
‘[<XXX 0x60000001d0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.’


**🏆结束语🏆 **

最后如果觉得我写的文章对您有帮助的话,欢迎点赞✌,收藏✌,加关注✌哦,谢谢谢谢!!

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值