在KVC中,当你传入的一个字符串键值不存在时,程序会直接报错,那么如何避免这个问题呢?
我们可以在类中重写以下两个方法:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
- (id)valueForUndefinedKey:(NSString *)key
接下来我们就来使用以下以上两个方法:
1.定义一个Student类
Student.h 的文件代码如下:
#import <Foundation/Foundation.h>
@interface Student : NSObject
@end
Student.m 的文件代码如下:
#import "Student.h"
@implementation Student
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
NSLog(@"设置时使用不存在的键值:%@",key);
}
- (id)valueForUndefinedKey:(NSString *)key {
NSLog(@"调用时使用不存在的键值:%@",key);
return nil;
}
@end
2.main.m文件的输出
main.m的文件代码如下:
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[Student alloc] init];
//使用不存在的键值
[stu setValue:@"张三" forKey:@"name"];
[stu valueForKey:@"name"];
}
return 0;
}
测试结果如下:
2015-08-08 11:58:05.167 Demo[532:25965] 设置时使用不存在的键值:name
2015-08-08 11:58:05.171 Demo[532:25965] 调用时使用不存在的键值:name
除此之外,还有KVC中还有以下两个很重要的方法:
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
1.使用- (id)valueForKeyPath:(NSString *)keyPath
方法如下:
main.m文件代码如下:
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建多个字典
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"张三",@"name",@"15",@"age",nil];
NSDictionary *dict2 = [NSDictionary dictionaryWithObjectsAndKeys:@"李四",@"name",@"16",@"age",nil];
NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"王五",@"name",@"17",@"age",nil];
//定义一个数组
NSArray *array= [NSArray arrayWithObjects:dict1,dict2,dict3,nil];
//数组使用KVC过滤
array = [array valueForKeyPath:@"name"];
//数组输出
for (NSString *str in array) {
NSLog(@"name = %@",str);
}
}
return 0;
}
测试结果如下:
2015-08-08 12:15:39.780 Demo[541:29205] name = 张三
2015-08-08 12:15:39.785 Demo[541:29205] name = 李四
2015-08-08 12:15:39.785 Demo[541:29205] name = 王五
2.’-(void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues’主要用于UI中的字典转模型,在UI中再介绍
至此,KVC中的常见用法以及全部讲完!