obj-c编程16:键值编码(KVC)
2023-09-14 08:56:51 时间
我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性。下面的例子,借助于KVC的功能读取和设置了类Son实例的属性i:
#import Foundation/Foundation.h #define msg(...) NSLog(__VA_ARGS__) #define mki(x) [NSNumber numberWithInt:x] @interface Son:NSObject{ NSArray *ary; NSNumber *i; @property NSArray *ary; @property NSNumber *i; @implementation Son @synthesize ary,i; -(id)init{ return [self init:0]; -(id)init:(int)i_v{ self = [super init]; if(self){ ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\ mki(100),nil]; i = [NSNumber numberWithInt:i_v]; return self; int main(int argc,char *argv[]) @autoreleasepool{ Son *son = [[Son alloc] init]; [son setValue:mki(1001) forKey:@"i"]; msg(@"%@",[son valueForKey:@"i"]); msg(@"%@",[son valueForKeyPath:@"ary.@count"]);
运行结果如下:
apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation k.m -o k apple@kissAir: objc_src$./k 2014-07-06 15:51:56.098 k[1386:507] 1001KVC其中有KeyPath的概念,比如类Baba中有一个属性名为son,其是Son的对象;而类Son中也有属性NSString name,这时我们可以使用KeyPath的语法,像遍历树一样找到最终的属性name:
[baba valueForKeyPath:@"son.name"];
[baba setValue:@"tom" forKeyPath:@"son.name"];
除了遍历对象关系以外,我们还可以访问一些操作对象集合的函数,比如求平均数等等:
下面实际看一个例子
#import Foundation/Foundation.h #define msg(...) NSLog(__VA_ARGS__) #define mki(x) [NSNumber numberWithInt:x] @interface Son:NSObject{ NSArray *ary; NSNumber *i; @property NSArray *ary; @property NSNumber *i; @implementation Son @synthesize ary,i; -(id)init{ return [self init:0]; -(id)init:(int)i_v{ self = [super init]; if(self){ ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\ mki(100),nil]; i = [NSNumber numberWithInt:i_v]; return self; int main(int argc,char *argv[]) @autoreleasepool{ Son *son = [[Son alloc] init]; [son setValue:mki(1001) forKey:@"i"]; msg(@"%@",[son valueForKey:@"i"]); msg(@"%@",[son valueForKeyPath:@"ary.@count"]); Son *son0 = [[Son alloc] init:11]; Son *son1 = [[Son alloc] init:200]; Son *son2 = [[Son alloc] init:25]; NSArray *ary = [NSArray arrayWithObjects:son,son0,son1,son2,nil]; msg(@"avg:%@",[ary valueForKeyPath:@"@avg.i"]); msg(@"sum:%@",[ary valueForKeyPath:@"@sum.i"]); return 0; }
运行结果如下:
apple@kissAir: objc_src$./k 2014-07-06 15:51:56.098 k[1386:507] 1001 2014-07-06 15:51:56.100 k[1386:507] 4 2014-07-06 15:51:56.100 k[1386:507] avg:309.25 2014-07-06 15:51:56.101 k[1386:507] sum:1237KVC解析(一) —— 基本了解KVC解析(二) —— 不可不知的赋值深层次原理KVC解析(三) —— 不可不知的取值深层次原理KVC解析(四) —— keyPath的深度解析KVC解析(五) —— KVC几种典型的异常处理KVC解析(六) —— KV...
h1 "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/25091">
相关文章
- 「Python 编程」编码实现网络请求库中的 URL 解析器
- 详解JavaScript中的Url编码/解码,表单提交中网址编码
- php使用file_put强制转换utf-8编码操作
- url 编码和解码
- 如何让编码更加的标准
- java IO之 编码 (码表 编码 解码 转换流)
- MySql修改数据库编码为UTF8
- 使用editplus等编程工具时UTF-8编码去掉BOM头方法(转载备查)
- 字节,字符,Unicode及Web编码
- Atitit node.js问题解决总结t99 目录 1.1. 找不到node程序1 1.2. GBK编码问题1 2. 按行读取gbk编码问题2 2.1. 先写入txt utf8 encode
- Atitit.软件开发概念说明--io系统区--特殊文件名称保存最佳实践文件名称编码...filenameEncode 1.1. 不个网页title保存成个个文件的时候儿有无效字符的问题...1
- 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法
- TF之Transformer:基于tensorflow和Keras框架(特征编码+Tokenizer处理文本+保存模型)针对UCI新闻数据集利用Transformer算法实现新闻文本多分类案例
- 基于FFmpeg将pcm+rgb编码并封装MP4
- 「Python 编程」编码实现网络请求库中的 URL 解析器
- Python编程:关于编码解码及UnicodeDecodeError
- Pyhton编程:解决python2中文编码乱码
- Python爬虫:url中带字典列表参数的编码转换
- python 读取unicode编码文件
- myeclipse 编码问题
- 将python3中os.popen()的默认编码由ascii修改为utf-8