iOS语法之KVC的使用

简介:

KVC简介

全称是Key-value coding,翻译成键值编码。顾名思义,在某种程度上跟map的关系匪浅。它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制。

KVC的应用

以下通过几个例子来说明KVC中得常用方法:

新建一个Student(学生)类

1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>

@class Course;
@interface Student : NSObject {
NSString *name;
Course *course;
NSInteger point;
NSArray *otherStudent;
}

@end

新建一个Course(课程)类

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>

@interface Course : NSObject {
NSString *courseName;
}

@end

案例分析:

下面的例子结合了大部分常用的方法,通过注释可以很好地理解,也可以copy下来自己运行看看。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
//
// ViewController.m
// testOC
//
// Created by Benjamin on 1/2/16.
// Copyright © 2016 Benjamin. All rights reserved.
//

#import "ViewController.h"
#import "Student.h"
#import "Course.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

[self useKey];
[self useKeyPath];
[self performCollection];
[self performDictionary];
}


/**
* .m文件也没有实现。name属性没有加property,原来的访问方法就访问不了name属性了。
使用KVC就可以轻松实现
*/

- (void)useKey {
Student *student = [[Student alloc] init];
[student setValue:@"Benjamin" forKey:@"name"];
NSString *name = [student valueForKey:@"name"];
NSLog(@"学生姓名:%@", name); //打印 学生姓名:Benjamin

NSLog(@"------------------------------------");
}

/**
* 使用Keypath(键路径)访问属性
*/

- (void)useKeyPath {
Student *student = [[Student alloc] init];
[student setValue:@"Benjamin" forKey:@"name"];

Course *course = [[Course alloc] init];
[course setValue:@"语文课" forKey:@"courseName"];
[student setValue:course forKey:@"course"];
NSString *courseName = [student valueForKeyPath:@"course.courseName"];
NSLog(@"课程名称:%@", courseName); //打印 课程名称:语文课

[student setValue:@"数学课" forKeyPath:@"course.courseName"];
courseName = [student valueForKeyPath:@"course.courseName"];
NSLog(@"新课程名称:%@", courseName); //打印 新课程名称:数学课

//NSInteger也可以使用NSString包装使用
[student setValue:@"88" forKey:@"point"];
NSString *point = [student valueForKey:@"point"];
NSLog(@"point: %@", point); //打印 point: 88

//推荐用这种方式使用基本数据类型
[student setValue:[NSNumber numberWithInteger:88] forKey:@"point"];
NSNumber *newPoint = [student valueForKey:@"point"];
NSLog(@"newPoint: %@", newPoint); //打印 newPoint: 88

NSLog(@"------------------------------------");
}

/**
* 操作集合
可以使用集合操作计算学生的平均分、最高分、总分、总人数等数据
*/

- (void)performCollection {
Student *student = [[Student alloc]init];
[student setValue:@"张三" forKey:@"name"];

Student *s1 = [[Student alloc] init];
Student *s2 = [[Student alloc] init];
Student *s3 = [[Student alloc] init];
[s1 setValue:@"77" forKey:@"point"];
[s2 setValue:@"88" forKey:@"point"];
[s3 setValue:@"99" forKey:@"point"];
NSArray *studentArray = [NSArray arrayWithObjects:s1, s2, s3, nil];
[student setValue:studentArray forKey:@"otherStudent"];
NSLog(@"其他学生的成绩: %@", [student valueForKeyPath: @"otherStudent.point"]);
NSLog(@"共有%@个学生", [student valueForKeyPath: @"otherStudent.@count"]);
NSLog(@"学生的总分: %@", [student valueForKeyPath: @"otherStudent.@sum.point"]);
NSLog(@"学生的最高分: %@", [student valueForKeyPath: @"otherStudent.@max.point"]);
NSLog(@"学生的最低分: %@", [student valueForKeyPath: @"otherStudent.@min.point"]);
NSLog(@"平均成绩: %@", [student valueForKeyPath: @"otherStudent.@avg.point"]);

/**
输出结果
2016-01-04 12:05:46.528 testOC[29855:945179] 其他学生的成绩: (
77,
88,
99
)
2016-01-04 12:05:46.529 testOC[29855:945179] 共有3个学生
2016-01-04 12:05:46.529 testOC[29855:945179] 学生的总分: 264
2016-01-04 12:05:46.529 testOC[29855:945179] 学生的最高分: 99
2016-01-04 12:05:46.529 testOC[29855:945179] 学生的最低分: 77
2016-01-04 12:05:46.529 testOC[29855:945179] 平均成绩: 88
**/


NSLog(@"------------------------------------");
}

/**
* 操作字典
*/

- (void)performDictionary {
NSDictionary *dic = @{@"name": @"jack",
@"point": [NSNumber numberWithInteger:12]};
Student *student = [[Student alloc] init];
[student setValuesForKeysWithDictionary:dic];
NSLog(@"姓名为: %@, 分数为: %@", [student valueForKey: @"name"], [student valueForKey: @"point"]);

/**
结果为
姓名为: jack, 分数为: 12
**/


NSLog(@"------------------------------------");
}

/**
实际使用举例
利用kvc的这个特性,我们可以访问系统里的一些私有变量。
例如:在UIPageControl里面有两个私有变量:
UIImage *_currentPageImage;
UIImage *_pageImage;
* 设置pageControl当前显示和未显示到脚标的样式了
*/

- (void)changePageControlImage {
UIPageControl *pageControl = [[UIPageControl alloc] init];
[pageControl setValue:[UIImage imageNamed:@"XX"] forKey:@"_currentPageImage"];
[pageControl setValue:[UIImage imageNamed:@"YY"] forKey:@"_pageImage"];
UIImage *currentImage = [pageControl valueForKey:@"_currentPageImage"];
UIImage *pageImage = [pageControl valueForKey:@"_pageImage"];
NSLog(@"currentImage: %@, pageImage: %@", currentImage, pageImage);

NSLog(@"------------------------------------");
}
@end
目录
相关文章
|
缓存 JavaScript iOS开发
iOS 逆向编程(十四)Cycript 语法入门
iOS 逆向编程(十四)Cycript 语法入门
219 0
|
缓存 JavaScript iOS开发
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
203 0
|
安全 iOS开发
iOS开发 - 字面语法之数组注意事项
iOS开发 - 字面语法之数组注意事项
89 0
|
存储 安全 Swift
iOS - 巧用字面量语法
iOS - 巧用字面量语法
109 0
|
Android开发 iOS开发
iOS开发:KVC与KVO
KVC 就是键值编码(key-value-coding),可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。 KVO 是键值观察者(key-value-observing)。实现方式:通过对某个对象的某个属性添加观察者,当该属性改变,就会调用”observeValueForKeyPath:”方法,为我们提供一个“对象值改变了!”的时机进行一些操作。
261 0
iOS开发:KVC与KVO
|
存储 搜索推荐 API
iOS-底层原理 22:KVC 底层原理
iOS-底层原理 22:KVC 底层原理
184 0
iOS-底层原理 22:KVC 底层原理
|
存储 API iOS开发
iOS底层原理:KVC分析(一)
KVC全称Key-Value Coding,俗称键值编码。它是一种通过字符串描述符而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制。在iOS中,NSObject、NSArray、NSDictionary等类使用这种机制并采用分类的形式为自身拓展了KVC的能力。
iOS底层原理:KVC分析(一)
|
网络协议 安全 API
iOS14适配汇总:【1、隐私权限相关:定位、相册、IDFA 2、KVC相关3、UIView相关;4、网络相关】
iOS14适配汇总:【1、隐私权限相关:定位、相册、IDFA 2、KVC相关3、UIView相关;4、网络相关】
522 0
iOS14适配汇总:【1、隐私权限相关:定位、相册、IDFA 2、KVC相关3、UIView相关;4、网络相关】
|
iOS开发
iOS底层原理:KVC分析(二)
简介: KVC全称Key-Value Coding,俗称键值编码。它是一种通过字符串描述符而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制。在iOS中,NSObject、NSArray、NSDictionary等类使用这种机制并采用分类的形式为自身拓展了KVC的能力。
|
iOS开发
IOS开发-KVC
kvc--key-value coding,健值编码 可以通过key直接访问对象属性的value的方法

热门文章

最新文章

  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    32
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    27
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 5
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 6
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    232
  • 7
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 8
    深入探索iOS开发中的SwiftUI框架
    143
  • 9
    ios样式开关按钮jQuery插件
    58
  • 10
    Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
    75