IOS开发-10.KVC

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值