iOS基础 - KVC

▶ 什么是 KVC 

1 - Key-Value-Coding 键值编码:一种间接访问实例变量的方法

2 - KVC 赋值机制

① 赋值查询成员变量的先后顺序是 _key、_isKey、key、isKey。比如实例变量 age,先后访问顺序就是 _age、_isAge、age、isAge

② 如果四个值都没有,就会调用 setValue:forUndefinedKey: 方法。注:如若需要,则必须重写该方法,否则程序 crash

3 - KVC 取值机制 

① 取值查询成员变量的顺序同赋值机制 _key、_isKey、key、isKey

② 如果四个值均获取不到,就会调用 valueForUndefinedKey 方法!注:如若需要,则必须重写该方法,否则程序 crash

4 - KVC 特点

① 很黄很暴力,即使一个类的属性是私有的,同样可以读写,相当于 Java 中的反射,破坏了类的封装

② 它的模型性质是通过一个简单的键(通常是字符串)来指定。在开发中,视图或控制器就可通过对应键来获取其属性值

▶ 使用 KVC

1 - 一个人饲养了一条狗,那么就有 Person 和 Dog 两个类,并且 Dog 就成了 Person 的成员变量。我们在 main.m 文件中使用 KVC 为 Person 的 Dog 这一成员变量进行赋值

// - Dog.h

1 #import <Foundation/Foundation.h>
2 
3 @interface Dog : NSObject
4 
5 @end

// - Dog.m

1 #import "Dog.h"
2 
3 @implementation Dog
4 
5 @end

// - Person.h

复制代码
 1 #import <Foundation/Foundation.h>
 2 @class Dog;
 3 @interface Person : NSObject
 4 {
 5     @private // 验证:私有属性同样可以被 KVC 无视,实现直接赋值
 6     NSString *_name;
 7     NSInteger _age;
 8     Dog *_dog;
 9 }
10 
11 @end
复制代码

// - Person.m

复制代码
 1 #import "Person.h"
 2 
 3 @implementation Person
 4 
 5 - (NSString *)description{
 6 
 7     return [NSString stringWithFormat:@"%@,%@,%ld",_name,_dog,_age];
 8 }
 9 
10 // 重写赋值方法
11 -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
12 
13     NSLog(@"value = %@",value);
14     NSLog(@"undefine Key = %@",key);
15 }
16 
17 // 重写取值方法
18 - (id)valueForUndefinedKey:(NSString *)key{
19     
20     NSLog(@"undefine key = %@",key);
21     return nil;
22 }
23 @end
复制代码

// - main.m

复制代码
 1 Person *person01 = [[Person alloc] init];
 2 // 第一个参数是值,第二个参数是键 (对应属性名)
 3 [person01 setValue:@"Hazell" forKey:@"name"];
 4 // 基本类型赋值时,需要先将其转化成数字对象。不必担心属性赋值,它带有自动解包过程:数字对象会被系统自动解包成基本类型,然后赋值给成员变量 _age
 5 [person01 setValue:@22 forKey:@"age"];
 6 NSLog(@"%@",person01);
 7 // 将狗和人绑定        
 8 Dog *dog01 = [[Dog alloc] init];
 9 [person01 setValue:dog01 forKey:@"dog"];
10 NSLog(@"%@",person01);
11         
12 // 取值
13 NSString *str01 = [person01 valueForKey:@"name"];
14 NSLog(@"%@",str01);
复制代码

2 - 一个作者可有多本书、一本书对应一个作者的场景,代码如下

// - Author.h:作者

1 #import <Foundation/Foundation.h>
2 
3 @interface Author : NSObject
4 {
5     NSString *_name;
6     NSArray *_issueBook;// 使用数组,模拟一个作者对应多本书籍
7 }
8 @end

// - Author.m

1 #import "Author.h"
2 
3 @implementation Author
4 
5 @end

// - Book.h:书

复制代码
 1 #import <Foundation/Foundation.h>
 2 @class Author;
 3 @interface Book : NSObject
 4 {
 5     Author *_author;// 作者
 6 }
 7 
 8 @property NSString *name; // 书名
 9 @property CGFloat price;  // 书价
10 
11 @end
复制代码

// - Book.m

1 #import "Book.h"
2 
3 @implementation Book
4 
5 @end

// - main.m

复制代码
 1 Author *author = [[Author alloc] init];
 2 [author setValue:@"莫言" forKeyPath:@"name"];
 3 
 4 Book *book1 = [[Book alloc] init];
 5 book1.name = @"红高粱";
 6 book1.price = 9;
 7 Book *book2 = [[Book alloc] init];
 8 book2.name = @"平凡的世界";
 9 book2.price = 10;
10 
11 NSArray *arrayBook = [NSArray arrayWithObjects:book1,book2,nil];
12 [author setValue:arrayBook forKeyPath:@"issueBook"]; // KVC 赋值
13 // KVC 取值
14 NSArray *priceArray = [author valueForKeyPath:@"issueBook.price"];
15 NSLog(@"%@",priceArray);
16 
17 // KVC 运算
18 NSNumber *count = [author valueForKeyPath:@"issueBook.@count"];// 数组大小
19 NSLog(@"count=%@",count);// @count 是特定一个写法,可以把它想象成一个方法
20 
21 NSNumber *sum = [author valueForKeyPath:@"issueBook.@sum.price"];// 书价总额
22 NSLog(@"%@",sum);// price 是属性,可以把它看成是 @sum 的一个参数,中间用点号进行连接
23 
24 NSNumber *avg = [author valueForKeyPath:@"issueBook.@avg.price"];// 平均值
25 NSLog(@"%@",avg);
26 
27 NSNumber *max = [author valueForKeyPath:@"issueBook.@max.price"];// 最大值和最小值
28 NSLog(@"%@",max);
29 NSNumber *min = [author valueForKeyPath:@"issueBook.@min.price"];
30 NSLog(@"%@",min);
复制代码

 

posted on   低头捡石頭  阅读(28)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示