除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。

如何使用KVC存取对象属性呢?看个示例

一、使用KVC存数据

定义一个person类

.h文件

#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject/** 姓名*/
@property (nonatomic, copy)NSString *name;/** 钱*/
@property (nonatomic, assign)double money;/** 宠物*/
@property (nonatomic, strong)Dog *dog;

@end

.m文件

#import "Person.h"@implementation Person
{@privateint _age;
}- (void)say
{NSLog(@"age = %i", _age);
}@end

再定义一个dog类

.h

#import <Foundation/Foundation.h>@interface Dog : NSObject/** 狗的外号*/
@property (nonatomic, copy)NSString *name;/** 狗的价格*/
@property (nonatomic, assign)double price;
@end

.m

#import "Dog.h"@implementation Dog@end

先创建一个对象

    Person *p = [[Person alloc] init];

p.name = @"chg"; // setter

p.money = 998.0;

除了这种方式赋值,可以使用KVC

#pragma mark 单个值//      KVC == KEY VALUE CODING// Value : 值, 只能传对象// forKey: 需要给谁(哪个属性)赋值// setValue:forKey:方法, 只能给对象的直接属性赋值[p setValue:@"lmj" forKey:@"name"];// @(998.0) == [NSNumber numberWithDouble:(double)][p setValue:@(668.0) forKey:@"money"];

#pragma mark 多层赋值p.dog = [Dog new];p.dog.name == [[p dog] setName:]p.dog.name = @"wangwang";p.dog.price = 110.0;// setValue:forKeyPath: 可以给对象的间接属性赋值. 多层赋值// 建议: 以后在开发中都使用setValue:forKeyPath:[p setValue:@"xiaoqiang" forKeyPath:@"dog.name"];[p setValue:@(110) forKeyPath:@"dog.price"];

#pragma mark 给私有成员变量赋值[p setValue:@"lnj" forKey:@"_name"];[p setValue:@(30) forKey:@"_age"];SEL sel = @selector(say);[p performSelector:sel];[p say];

#pragma mark 字典转模型NSDictionary *dict = @{@"name":@"xxx",@"money": @(998.1),//                           @"score":@(100)@"dog":@{@"name":@"wangcai",@"price":@(110)}};// 注意点:// 1.如果想使用KVC进行字典转模型, 那么字典中的key必须和模型中的属性一模一样(个数 + 名称)//  this class is not key value coding-compliant for the key score.'// 2.如果使用KVC进行字典转模型, 只能对当前调用KVC方法的对象进行转换, 不能对它的属性的对象进行转换// setValuesForKeysWithDictionary:方法内部的实现原理// 1.会拿到字典中的key, 然后根据这个key取出字典中的值, 然后再根据这个key赋值给对象//   [p setValue:@"xxx" forKey:@"name"];
    [p setValuesForKeysWithDictionary:dict];NSLog(@"p.dog = %@", p.dog);NSLog(@"name = %@, money = %f", p.name, p.money); // getter

二、使用KVC取数据

首先设置一些数据

    Person *p = [Person new];p.name = @"chg";p.money = 998;p.dog = [Dog new];p.dog.name = @"wangcai";p.dog.price = 110;

有以下几种方式取值

#pragma mark 获取单个值NSString *name =  [p valueForKey:@"name"];NSLog(@"name = %@", name);double money = [[p valueForKey:@"money"] doubleValue];NSLog(@"money = %f", money);

#pragma mark 获取多层值NSString *dogName = [p valueForKey:@"dog.name"];NSString *dogName = [p valueForKeyPath:@"dog.name"];NSLog(@"dogName = %@", dogName);

#pragma mark 模型转字典NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name", @"money"]];

#pragma mark 获取数组中对象的值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);

#pragma mark 运算符// 获取arr数组中money的平均值id res1 = [arr valueForKeyPath:@"@avg.money"];// 获取arr数组中money的最大值id res2 = [arr valueForKeyPath:@"@max.money"];// 获取arr数组中money的最小值id res3 = [arr valueForKeyPath:@"@max.money"];NSLog(@"res1 = %@,res2 = %@,res3 = %@", res1,res2,res3);

转载于:https://www.cnblogs.com/chglog/p/4666081.html

iOS开发——UI基础-KVC相关推荐

  1. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  2. ios开发-UI基础-应用管理(单纯界面)

    功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应 ...

  3. iOS开发——UI基础-UIImage,UIImageView的使用

    1.UIImage 创建UIImage的两种方法 UIImage *image = [UIImage imageNamed:imageNmae];UIImage *image = [UIImage i ...

  4. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  5. iOS开发UI篇—实现UITableview控件数据刷新

    iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...

  6. iOS开发UI篇—CALayer简介

    iOS开发UI篇-CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UI ...

  7. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇-使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: 1 //2 // YY ...

  8. iOS开发UI篇-在UItableview中实现加载更多功能

    iOS开发UI篇-在UItableview中实现加载更多功能 一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据. 二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时 ...

  9. android tableview实现多选功能,iOS开发UI篇-tableView在编辑状态下的批量操作(多选)...

    先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...

  10. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

最新文章

  1. Openssl私建CA
  2. VTK:PolyData之TriangleColoredPoints
  3. Hive常用的操作命令
  4. sqlite和java_Java和SQLite
  5. java的printf语法_Java中printf的用法总结
  6. UIButton设置圆角和边框
  7. 【模板】线段树(区间加)
  8. 业内对楼市回暖时间几成共识:尚需一年
  9. iOS设计模式之代理模式
  10. idea里查找maven的jar包冲突
  11. swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
  12. c语言编程能力提高,C语言编程能力的培养
  13. 银行卡四要素实名验证,你知道多少?
  14. libcurl返回DNS无法解析的问题
  15. 和Ajax斗志斗勇的日子
  16. 移动端1px边框实现
  17. 台式机,在不能连网线的情况下,如何连接WiFi呢?
  18. must be unique: xxx.xxx.xxx:xxx:jar -> duplicate declaration of version 0.0.1 @ line 25, column 21
  19. 360html收藏夹,360浏览器的收藏夹如何保存?360浏览器收藏夹备份方法
  20. 动态gif图如何在线制作?gif动图制作在线如何操作?

热门文章

  1. 深刻反省:好的习惯必须坚持,不论心情怎样
  2. 娟红静敏,从女孩子名中可以看出什么
  3. NSString中如何正确判断包含一个变量字串NSString
  4. 线程令牌桶的实现及条件变量改进版本
  5. oracle 数据库用户配置,Oracle数据库安装配置示例
  6. java 快速创建map_快速创建Map并初始化,超级简单
  7. linux apache 依赖包,利用 yum 解决 Linux 软件包的依赖关系
  8. xshell左侧导航栏_Axure教程:(初级)导航中的页面切换
  9. java 取模运算_JAVA算术运算符_四则与取模
  10. 系统同传软件_语情快递 | 手语同传AI,你见过吗?