Objective-C 基础知识之 (十五):KVC

来源:互联网 发布:环境破坏的资料数据 编辑:程序博客网 时间:2024/05/16 17:05

KVC

Key-Value-Coding  键值编码,是一种间接访问实例变量的方法。

Key:用于标识实例变量。

Value:实例变量对应的值。

使用场景:创建的类的实例变量声明为私有,在类的外部需要使用时采用此方法赋值和取值。

例:只声明Person对象,未声明实例变量和实现方法。

创建Person对象:Person * p = [ [Person alloc]init];

主要方法如下:

使用:setValue: forKey: 为需要的变量赋值。

[p setValue:@” Joe”forKey:@”name”];

使用:valueForKey: 读取值

NSLog(@"%@", [pvalueForKey:@"name"]);

 

当key不存在的时候,会执行setValue:forUndefinedKey:

如果赋值时的key和读取的key不一致,在类的实现文件中实现:

-  (void)setValue:(id)value forUndefinedKey:(NSString *)key

{    可以没有函数体

}

如果读取时的key和赋值时的key不一致,在类的实现文件中实现:

-(id)valueForUndefinedKey:(NSString *)key

{    可以返回错误说明。

}


setValuesForKeysWithDictionary:

使用场景为:获取一组联系人的信息

数组中存储了N个联系人,使用字典来表示联系人。(在iOS开发时,需要将字典封装成对象)

1、创建对象

2、将字典中的值取出来,存入对象的实例变量中。

创建一个字典,描述一个学生的信息

NSDictionary * dic= @{@"name": @"Joe",

                      @"gender":@"female",

                      @"age": @20,

                      @"id":@1};

创建存储字典值的对象

Student * stu =[[Student alloc]init];

常规方法:   

stu.name = [dicobjectForKey:@"name"];

stu.gender = [dicobjectForKey:@"gender"];

stu.name = [[dicobjectForKey:@"age"] integerValue];

 

使用setValuesForKeysWithDictionary:一次性存储数据。      

[stu setValuesForKeysWithDictionary:dic];

       

NSLog(@"%@",stu.name);

NSLog(@"%@",stu.gender);

NSLog(@"%ld",stu.age);

NSLog(@"%ld",stu.number);

 

如果字典中使用了和OC中一样的关键字,则要在类的实现文件中实现对应的处理方法:

如:字典中使用了id关键字。

-(void)setValue:(id)value forUndefinedKey:(NSString *)key

{

//字典中的key是id, 实例变量是number  

//如果使用setValue:forKey:时,传入的key是id,把id的值赋给number

if ([keyisEqualToString:@"id"]) {

_number = [valueintegerValue];

}   

}

 

 

setValue:forKeyPath:

valueForKeyPath:

使用场景:类中有类,如学生对象中包含了一个书的类。

给书赋值和取值:

创建学生对象:Student * s = [[Student alloc]init];

创建书对象:Book * b = [[Book alloc]init];

s.book = b;

给学生的书籍设置名字,路径:student -> book -> name

[ssetValue:@"xiyouji" forKeyPath:@"book.name"];

NSLog(@"%@",[s valueForKeyPath:@"book.name"]);

 

也可以使用点语法:

s.book.name =@"sanguo";

NSLog(@"%@",s.book.name);



0 0