IOS开发-10.KVC
来源:互联网 发布:张忻铃 知乎 编辑:程序博客网 时间:2024/05/21 06:22
1.KVC概述
- KVC(Key Value Coding),键值编码,是IOS中用来设置属性和获取属性值的大招
- 任何对象的属性,我们都能通过KVC获取和修改
2.KVC基本使用
- 通过一个小案例说明KVC的使用,这里我们定义了一个Person类和一个Dog类,Person类中有二个属性,并且拥有一个Dog类
//声明一个Person类@interface Person : NSObject/** 姓名*/@property (nonatomic, copy)NSString *name;/** 钱*/@property (nonatomic, assign)double money;/** 宠物*/@property (nonatomic, strong)Dog *dog;- (void)say;@end// 声明一个Dog类@interface Dog : NSObject/** 狗的外号*/@property (nonatomic, copy)NSString *name;/** 狗的价格*/@property (nonatomic, assign)double price;@end
3.通过KVC修改属性
- 常规方法修改属性
Person *p = [Person new]; p.name = @"名字"; p.money = 998.0;
- 通过KVC设置(修改)属性的值
// Value : 值, 只能传对象// forKey: 需要给谁(哪个属性)赋值// setValue:forKey:方法, 只能给对象的直接属性赋值[p setValue:@"名字1" forKey:@"name"];// @(998.0) == [NSNumber numberWithDouble:(double)][p setValue:@(668.0) forKey:@"money"];
- 多层赋值
p.dog = [Dog new];// 常规方法/*p.dog.name == [[p dog] setName:]p.dog.name = @"wangwang";p.dog.price = 110.0;*///KVC// setValue:forKeyPath: 可以给对象的间接属性赋值. 多层赋值// 建议: 以后在开发中都使用setValue:forKeyPath:[p setValue:@"xiaoqiang" forKeyPath:@"dog.name"];[p setValue:@(110) forKeyPath:@"dog.price"];
由于setValue:forKeyPath:能够给对象的见解属性赋值,而setValue:forKey:方法不可以,所以建议在以后的开发中使用前者
给私有变量赋值
// 在.m文件中定义私有变量和私有方法[p setValue:@"lnj" forKey:@"_name"];[p setValue:@(30) forKey:@"_age"]; // 通过SEL可以访问类的私有方法SEL sel = @selector(say);[p performSelector:sel];[p say];
综上,OC中的私有属性可以通过KVC来访问,私有方法可以通过SEL来访问,可见在OC中没有真正意义上的私有属性和方法
字典转模型
NSDictionary *dict = @{ @"name":@"xxx", @"money": @(998.1), // @"score":@(100) @"dog":@{ @"name":@"wangcai", @"price":@(110) } };// 普通调用p.name = dict[@"name"];p.money = [dict[@"money"] doubleValue];// KVC// setValuesForKeysWithDictionary:方法内部的实现原理 // 1.会拿到字典中的key, 然后根据这个key取出字典中的值, 然后再根据这个key赋值给对象// [p setValue:@"xxx" forKey:@"name"];[p setValuesForKeysWithDictionary:dict];
- 字典转模型KVC注意点:
- 1.如果想使用KVC进行字典转模型, 那么字典中的key必须和模型中的属性一模一样(个数 + 名称),不然会报错: this class is not key value coding-compliant for the key score.’
- 2.如果使用KVC进行字典转模型, 只能对当前调用KVC方法的对象进行转换, 不能对它的属性的对象进行转换
4.通过KVC获取对象属性
- 获取单个值
NSString *name = [p valueForKey:@"name"];NSLog(@"name = %@", name);double money = [[p valueForKey:@"money"] doubleValue];NSLog(@"money = %f", money);
- 获取多层值
//NSString *dogName = [p valueForKey:@"dog.name"];//报错,不能获取多层值NSString *dogName = [p valueForKeyPath:@"dog.name"];NSLog(@"dogName = %@", dogName);
注意:valueForKey: 不能获取多层值
模型转字典
NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name", @"money"]];NSLog(@"%@", dict);
- 获取对象中数组的值
Person *p1 = [Person new]; p1.name = @"zs"; p1.money = 111; Person *p2 = [Person new]; p2.name = @"ls"; p2.money = 222; Person *p3 = [Person new]; p3.name = @"ww"; p3.money = 666; NSArray *arr = @[p1, p2, p3];// 如果数组中的元素都是同一种类型的数据, 可以使用KVC获取数组中所有对象的某个属性的值 NSArray *res = [arr valueForKeyPath:@"name"]; NSLog(@"res = %@", res);
- 通过运算符取值
id res1 = [arr valueForKeyPath:@"@avg.money"];//取平均值 id res2 = [arr valueForKeyPath:@"@max.money"];//取最大值 id res3 = [arr valueForKeyPath:@"@min.money"];//取最小值 NSLog(@"res = %@", res1);
0 0
- IOS开发-10.KVC
- iOS开发-kvc
- IOS开发-KVC
- IOS应用开发-KVC/KVO
- iOS开发--KVC & KVO
- iOS开发 - KVO/KVC
- iOS开发 - KVC
- IOS 高级开发 KVC(一),ios开发kvc
- iOS 高级开发 KVC(一),ios开发kvc
- iOS开发:KVO和KVC
- iOS开发之KVC、KVO
- iOS开发 KVC和KVO
- IOS开发 - KVC 和 KVO
- 【iOS开发系列】KVC&KVO
- iOS开发:KVO和KVC
- iOS开发之KVC/KVO
- iOS开发 ☞ KVC详解
- IOS开发之----KVC的使用
- 可拖拽排序的GridView
- 使用android-support-v7-appcompat包ActionBar不能显示图标,低版本手机运行显示不正常
- poj1143Number Game
- emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel HAXM is
- spring annotation注解 autowire
- IOS开发-10.KVC
- 在Linux系统下,重启Tomcat使用命令操作的!
- 关于Linux 设置ip绑定问题 以及mysql 设置固定Ip访问问题
- C++中placement new操作符(经典)
- Excel GET.CELL
- 实习总结(1)
- ORA-00845: MEMORY_TARGET not supported on this system
- java入门三座大山:抽象、封装和多态
- 项目中我为什么用Mongodb取代Mysql