KVC –key value Coding,可以让我们通过键值编码的形式进行属性值的赋值

参考苹果官网的图。。

1.KVC

定义一个Person类

.h文件

   1:  #import <Foundation/Foundation.h>
   2:  
   3:  @interface Person : NSObject
   4:  {
   5:     NSString *name;
   6:  }
   7:   
   8:  @end

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.m文件

   1:  #import "Person.h"
   2:   
   3:  @implementation Person
   4:   
   5:  @end

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

通过普通的获取属性的方法是无法对name进行赋值和取值操作的,这种情况可以通过KVC来进行设置和取值

   1:  - (void)viewDidLoad {
   2:      [super viewDidLoad];
   3:      // Do any additional setup after loading the view, typically from a nib.
   4:     Person  person=[[Person alloc]init];
   5:      [person setValue:@"keith" forKey:@"name"];
   6:      NSLog(@"name is %@",[person valueForKey:@"name"]);
   7:  }

输出:

2014-11-26 21:51:12.237 KVCtest[543:10453] name is keith

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

赋值用setValue:forKey:

取值用 valueForKey:

2.键路径

如果类中包含其他的类怎么办呢,访问这个类的属性怎么办呢。可以使用setValue: forKeyPath: 和valueForKeyPath设置和获取

如定义一个car

.h文件

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
NSString *carname;
}
@end

将Person的.h改成

#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
{
NSString *name;
Car *hiscar;
}
-(id)init;
@end

.m为

#import "Person.h"
#import "Car.h"
@implementation Person
-(id)init{
if (self=[super init]) {
hiscar=[[Car alloc]init];
}
return self;
}
@end

这里实现了car的实例化,如果不这么做在键值编程时候hiscar因为没有初始化而出现无法赋值的情况

调用:

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person=[[Person alloc]init];
[person setValue:@"keith" forKey:@"name"]; [person setValue:@"QQ" forKeyPath:@"hiscar.carname"];
NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]); /*或者这样*/
Car *car=[[Car alloc]init];
[car setValue:@"BeiKy" forKey:@"carname"];
[person setValue:car forKey:@"hiscar"];
NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]); }
输出结果

2014-11-26 22:45:47.392 KVCtest[1031:25564] name is keith,hiscar is QQ
2014-11-26 22:45:47.394 KVCtest[1031:25564] name is keith,hiscar is BeiKy


3.类型封装和转换

再次修改Person.h文件

#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
{
NSString *name;
Car *hiscar;
NSInteger age;//增加一个年龄类型是NSInteger
}
-(id)init;
@end
 

那么如何在设置的时候会发生什么呢?

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *person=[[Person alloc]init];
[person setValue:@"keith" forKey:@"name"];
[person setValue:@"QQ" forKeyPath:@"hiscar.carname"];
[person setValue:@"24" forKeyPath:@"age"];//为年龄赋值
NSLog(@"name is %@, is %@ old ,hiscar is %@",[person valueForKey:@"name"],[person valueForKey:@"age"],[person valueForKeyPath:@"hiscar.carname"]); }

结果是:

2014-11-26 22:56:08.873 KVCtest[1086:27956] name is keith, is 24 old ,hiscar is QQ

4.操作集合

在Person中添加一个otherPerson

#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
{
NSString *name;
Car *hiscar;
NSInteger age;
NSMutableArray *otherPerson;
}
-(id)init;
@end

属性.@sum.属性,还有@count,@avg,@max.@min

-(void)kvcCollection{
Person *person=[[Person alloc]init];
[person setValue:@"keith" forKey:@"name"];
Person *person1=[[Person alloc]init];
Person *person2=[[Person alloc]init];
Person *person3=[[Person alloc]init];
Person *person4=[[Person alloc]init];
NSMutableArray *others=[[NSMutableArray alloc]initWithObjects:person1,person2,person3,person4, nil];
NSInteger agenum=20;
for (Person *p in others) {
[self setage:p age:[[NSString alloc]initWithFormat:@"%ld",agenum++]];
}
[person setValue:others forKey:@"otherPerson"];
NSLog(@"other's age is %@",[person valueForKeyPath:@"otherPerson.age"]);
NSLog(@"the avg age is %@",[person valueForKeyPath:@"otherPerson.@avg.age"]);
NSLog(@"the sum age is %@",[person valueForKeyPath:@"otherPerson.@sum.age"]);
NSLog(@"the count person is %@",[person valueForKeyPath:@"otherPerson.@count.age"]);
NSLog(@"the min age is %@",[person valueForKeyPath:@"otherPerson.@min.age"]);
NSLog(@"the max age is %@",[person valueForKeyPath:@"otherPerson.@max.age"]); }
-(void)setage:(Person *)person age:(NSString *)age{
[person setValue: age forKey:@"age"];
}

输出

2014-11-26 23:51:00.180 KVCtest[1346:42300] other's age is (
    20,
    21,
    22,
    23
)
2014-11-26 23:51:00.183 KVCtest[1346:42300] the avg age is 21.5
2014-11-26 23:51:00.183 KVCtest[1346:42300] the sum age is 86
2014-11-26 23:51:00.184 KVCtest[1346:42300] the count person is 4
2014-11-26 23:51:00.184 KVCtest[1346:42300] the min age is 20
2014-11-26 23:51:00.184 KVCtest[1346:42300] the max age is 23

本文参考 容芳志博客,感谢这位博友

著作权声明:本文由http://www.cnblogs.com/keithmoring/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

KVC示例的更多相关文章

  1. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  2. ObjC 巧用反射和KVC实现JSON快速反序列化成对象

    1.简单的KVC介绍 KVC是一种间接访问对象属性的机制,不直接调用getter 和 setter方法,而使用valueForKey 来替代getter 方法,setValue:forKey来代替se ...

  3. iOS开发——UI基础-KVC

    除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性. 如何使用KVC存取对象属性呢?看个示例 一.使用KVC存数据 定义一个person ...

  4. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  5. Key-Value-Coding(KVC)

    Objective-C语法之KVC的使用   除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性. 下图来自苹果官网: 如何使用KVC存 ...

  6. KVC笔记

    利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 示例代码:  示例一: Person *p = [[Person alloc] init]; p.dog = [[Dog al ...

  7. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  8. KVC/KVO总结

    KVC(键值编码) 动态设置: setValue:属性值 forKey:属性名(用于简单路径) setValue:属性值 forKeyPath:属(用于复合路径,例如Person有一个Account类 ...

  9. iOS开发—字典转模型,KVC设计模式

    iOS开发UI基础—字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组 ...

随机推荐

  1. android adt 最新下载地址23.03

    打开这个网址就可以看到adt的详细信息:  http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...

  2. iOS开发-Object-C学习之结构体使用

    前言:定义结构体并不是定义一个变量,而是定义了种数据类型. 结构体作用: 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实 ...

  3. Quartz.net基于数据库的任务调度管理(Only.Jobs)

    一 前言: 各大调度组件优缺点在这就不讨论了,使用Quartz.net是因为它可以执行秒级任务. Only.Jobs 项目通过将各Job存储在数据库中,启动一个专门的Job管理任务来循环调度各Job的 ...

  4. java正则表达式基础知识(转)

    1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...

  5. centos下nginx启动脚本和chkconfig管理

    在安装完nginx后,重新启动需要“kill -HUP nginx进程编号”来进行重新加载,显然十分不方便.如果能像apache一样,直接通过脚本进行管理就方便多了. nginx官方早就想好了,也提供 ...

  6. 集成学习1-Boosting

    转自http://blog.csdn.net/lvhao92/article/details/51079018 集成学习大致分为两类,一类串行生成.如Boosting.一类为并行化.如Bagging和 ...

  7. 680. Valid Palindrome II【easy】

    680. Valid Palindrome II[easy] Given a non-empty string s, you may delete at most one character. Jud ...

  8. 李洪强-CALayer4-自定义层

    自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进 ...

  9. jdbctemplate中的query(sql,params,mapper)与queryForList(sql,params,class)区别

    query(sql,params,mapper):是针对自定义对象类型的查询语句,比如: jdbcTrade.query(sql, params, new AMapper()); queryForLi ...

  10. iOS开发--用户点击频繁,多个异步网络请求取消问题?

    一.业务环境描述 当一个view同时添加两个tableView为subView的时候,两个tableView分别为mainTable和subTable. 当用户点击mainTable上的某一条数据时, ...