键值编码(key-value coding)是一种间接更改对象状态的方式。通过传入的字符串(key)查找要更改的对象的状态。查找的规则是,先查找以字符串(key)命名的getter和setter方法。如果没有找到对应的方法,再查找key和_key的实例变量。
- KVC中基本调用的两个方法:
- valueForKey:
NSString *name = [self.studentModel valueForKey:@"name"];
- setValue:forKey:
[self.studentModel setValue:@"李四" forKey:@"name"];
- 对于标量值,会自动进行装箱和拆箱。
- 使用键路径:
- valueForKeyPath:
NSString *phone = [self.schoolModel valueForKeyPath:@"classModel.name"];
- setValue:forKeyPath:
[self.schoolModel setValue:@"初三五班" forKeyPath:@"classModel.name"];
- 对数组进行操作,会对数组的每个元素调用valueForKey:
NSArray *gradeArray = [self.studentModel valueForKeyPath:@"scoreArray.grade"];
- 快速运算
- 求个数
NSNumber *count = [self.studentModel valueForKeyPath:@"scoreArray.@count"];
- 求和:
NSNumber *sum = [self.studentModel valueForKeyPath:@"scoreArray.@sum.grade"]
- 求平均:
NSNumber *avg = [self.studentModel valueForKeyPath:@"scoreArray.@avg.grade"];
- 求并集,去掉重复元素:@distinctUnionOfObject
- 批量处理
- setValuesForKeysWithDictionary:
NSDictionary *newInfoDic = @{@"name":@"王五", @"phoneNumber":@"15123456789"}; [self.studentModel setValuesForKeysWithDictionary:newInfoDic];
- dictionaryWithValuesForKeys:
NSDictionary *dic = [self.studentModel dictionaryWithValuesForKeys:@[@"name", @"phoneNumber"]];
-
可以覆写setNilValueForKey:,定义传递nil时的处理方式:
- (void)setNilValueForKey:(NSString *)key{ if ([key isEqualToString:@"name"]) { name = @"未填"; }else{ [super setNilValueForKey:key]; }}
-
可以通过覆写setValue:forUndefinedKey:,处理未定义键的处理方式。
-
nil和[NSNull null]。在批量处理时,若值为nil,就会返回[NSNull null]。使用NSLog输出时,nil为(null),[NSNull null]为<null>。
网友评论