KVC
全称为:Key Value coding 键值编码
setValue: forKey:修改值。
valueForKey:传入属性的名字。
setValue:forKeyPath:通过键路径来修改。
valueForKeyPath:传入属性的路径就是xx.xx的形式。
KVC的优点是为安全机制完善,通过Key去查找Value的形式有助于在后期开发的设计模式上有很大的帮助。
四种编码的格式。意思就是通过键来取值
看一个实际例子;
//练习二:当猎人走进森林的时候,发现了三头野猪,野猪体重分别是100,200,300 . 但是猎人只想猎取200斤的野猪,于是他开始打猎,打猎过后发现是100斤的野猪,他继续打猎一直打到200斤的野猪,他会说一句:终于可以回家了!请用KVC的写法去实现
//练习三:如果森林也作为一个类,应该怎么实现?
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Pig.h"
#import "Forest.h"
int main(int argc, const char * argv[]) {
//实例化
Person *person = [[Person alloc]init];
Pig *pig = [[Pig alloc]init];
Pig *pigI = [[Pig alloc]init];
Pig *pigII = [[Pig alloc]init];
//属性设置
[person setValue:"猎人" forKey:
"name"];
[pig setValue:"100" forKey:
"weight"];
[pigI setValue:"200" forKey:
"weight"];
[pigII setValue:"300" forKey:
"weight"];
//创建森林集合,把猪放到森林里
Forest *forestI = [[Forest alloc]init];
NSArray *array = @[pig , pigI , pigII];
[forestI setValue:array forKey:"array"];
//给猎人一个目标
[person setValue:
"200" forKey:"target"];
//取出打猎的目标
int target = [[person valueForKey:
"target"] intValue];
//第一次固定打到100斤猪
for (int i = 0 ; i < [array count]; i++) {
//需要转换成野猪的类型
Pig *pigTmp = array[i];
//比较是否为100斤,或者转换为String ,或者int
int weightTmp = [[pigTmp valueForKey:@"weight"]intValue];
if (weightTmp 100) {
NSLog("不是你想要的目标!");
}
//往后继续打猎,直到打到200斤的为止
if(weightTmp target){
NSLog(
"任务完成了");
break;
}else{
NSLog("没打到就继续打!这次野猪体重为:%
",[pigTmp valueForKey:@"weight"]);
}
}
Person.h
#import <Foundation/Foundation.h>
#import "Pig.h"
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)Pig *hunterBoar;
@property(nonatomic,assign)int target;
@end
Pig.h
#import <Foundation/Foundation.h>
@interface Pig : NSObject
@property(nonatomic,assign)int weight;
@end
Forest.h
#import <Foundation/Foundation.h>
@interface Forest : NSObject
@property(nonatomic,strong)NSArray *array;
@end
往后还有一些扩展知识!avg:平均值
“猪平均体重%
NSLog(斤",[forestI valueForKeyPath:
"[email protected]"]);
count:总数
“猪有%
NSLog(个",[forestI valueForKeyPath:
"array.@count"]);
max:最大
"最有质量猪是%
NSLog(斤",[forestI valueForKeyPath:
"[email protected]"]);
min:最小
"都是瘦肉的猪%
NSLog(斤",[forestI valueForKeyPath:
"[email protected]"]);
sum:总数
“猪总和%
NSLog(斤",[forestI valueForKeyPath:
"[email protected]"]);
针对数组的情况
@distinctUnionOfObjects:返回指定属性去重后的值的数组
@unionOfObjects:返回指定属性的值的数组,不去重
属性的值不能为空,否则产生异常。
NSArray *array2 = [@3,@2,@1,@2];
NSArray *array3 = [array2 valueForKeyPath:
"unionOfObjects.self"];
NSLog(
"—————————————%@——————————————",array3);
NSArray *array4 = [array2 valueForKeyPath:"@distinctUnionOfObjects.self"];
NSLog(
"%@",array4);