Objective-C 「KVC键值编码」

Objective-C 「KVC键值编码」_第1张图片
Objective-C
  • Key Value Coding(键-值-编码)
    -NSKeyValueCoding一个非正式的协议,提供一种机制来间接访问对象的属性。
  • KVO 就是基于 KVC 实现的关键技术之一。
  • 它是一种使用字符串标识符,间接访问对象属性的机制,而不是直接调用getter 和 setter方法。
  • 通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法
    注意: 使用KVC赋值和取值,key和属性名要保持一致,否侧会导致崩溃

一、使用KVC

使用KVC对属性赋值,取值

People.h文件中

#import 

@interface People : NSObject{
    NSString *name;  //属性
}
@end

KVC使用

#pragma mark     //////////KVC使用//////////
    People *people = [[People alloc] init];
    //使用KVC赋值
    [people setValue:@"LuisX" forKey:@"name"];
    //使用KVC取值
    NSString *name = [people valueForKey:@"name"];
    NSLog(@"%@", name);
    //输出: LuisX

二、键路径访问

使用KVC对属性的属性赋值,取值
KVC在按照键值路径取值时,会自动层层深入,获取对应的键值

People.h文件中

#import 
#import "Address.h"

@interface People : NSObject{
    NSString *name;
    Address *address; //添加其他类属性
}
@end

Address.h文件中

#import 

@interface Address : NSObject{    
    NSString *code;
}
@end

键路径访问

#pragma mark     //////////键路径访问//////////
    People *people = [[People alloc] init];
    [people setValue:@"LuisX" forKey:@"name"];
    NSString *name = [people valueForKey:@"name"];
    NSLog(@"%@", name);
    //输出:   LuisX

    //方式一:  使用setValue...forKey赋值   valueForKeyPath取值
    Address *address = [[Address alloc] init];
    [address setValue:@"10010" forKey:@"code"];
    [people setValue:address forKey:@"address"];
    NSString *code1 = [people valueForKeyPath:@"address.code"];
    NSLog(@"方式1:%@", code1);
    //输出:   方式1:10010

    //方式二:  使用setValue...forKeyPath赋值   valueForKeyPath取值
    [people setValue:@"10010" forKeyPath:@"address.code"];
    NSString *code2 = [people valueForKeyPath:@"address.code"];
    NSLog(@"方式2:%@", code2);
    //输出:   方式2:10010

三、自动封装基本数据类型

使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。

People.h文件中

#import 
#import "Address.h"

@interface People : NSObject{
    NSString *name;
    Address *address;
    NSInteger number; //添加基本数据类型属性
}
@end

自动封装基本数据类型

#pragma mark     //////////自动封装基本数据类型//////////
    People *people = [[People alloc] init];
    [people setValue:@"88" forKey:@"number"];
    NSString *number = [people valueForKey:@"number"];  //NSInteger类型转字符串
    NSLog(@"%@", number);
    //输出: 88

四、操作集合

KVC按照键值路径取值时,如果对象不包含指定的键值,会自动进入对象内部,查找对象属性(例如数组内部)

People.h文件中

#import 
#import "Address.h"

@interface People : NSObject{
    NSString *name;
    Address *address;
    NSInteger number;
    NSArray *morePeople;    //添加集合类型属性
}
@end

操作集合

#pragma mark     //////////操作集合//////////
    People *people = [[People alloc] init];
    
    People *p1 = [[People alloc] init];
    People *p2 = [[People alloc] init];
    People *p3 = [[People alloc] init];
    [p1 setValue:@"65" forKey:@"number"];
    [p2 setValue:@"77" forKey:@"number"];
    [p3 setValue:@"99" forKey:@"number"];
    NSArray *array = [NSArray arrayWithObjects:p1, p2, p3, nil];
    [people setValue:array forKey:@"morePeople"];
    
    NSLog(@"数组中元素的number值:%@", [people valueForKeyPath:@"morePeople.number"]);
    NSLog(@"元素个数:%@", [people valueForKeyPath:@"morePeople.@count"]);
    NSLog(@"元素最大:%@", [people valueForKeyPath:@"[email protected]"]);
    NSLog(@"元素最小:%@", [people valueForKeyPath:@"[email protected]"]);
    NSLog(@"元素平均:%@", [people valueForKeyPath:@"[email protected]"]);
    //输出: 数组中元素的number值:(65, 77, 99)
    //输出: 元素个数:3
    //输出: 元素最大:99
    //输出: 元素最小:65
    //输出: 元素平均:80.333333333333333333333333333333333333

拓展阅读:
Objective-C KVC机制
KVC/KVO原理详解及编程指南
iOS KVC & KVO

你可能感兴趣的:(Objective-C 「KVC键值编码」)