kvc机制与kvc的常用方法

本文详细介绍了Objective-C中的键值编码(KVC),包括如何通过键名访问对象属性、使用键路径获取嵌套对象的属性以及如何利用KVC进行字典与模型间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kvc是key value coding的缩写,即:键值编码。键值编码提供了非常强大的功能:只要存在访问器方法、声明属性或实例变量,就可以将其名字指定为字符串来访问。

// 返回表示属性的键字符串对应的值

- (id)valueForKey:(NSString *)key;

Person *p1 = [[Person alloc] init];
[p1 setValue:@"张三" forKey:@"name"];
 NSString *name = [p1 valueForKey:@"name"];


// 将键字符串key所对应的属性的值设置为value

- (void)setValue:(id)value forKey:(NSString *)key;

// p1是Person类的对象,name是Person类的一个属性
Person *p1 = [[Person alloc] init];       
[p1 setValue:@"张三" forKey:@"name"];
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// 以点“.”切分键路径,并使用第一个键像接收器发送valueForKey:方法,然后在使用路径的下一个键,向得到的对象发送valueForKey:fangfa,如此反复操作,返回最后获得的对象。

- (id)valueForKeyPath:(NSString *)keyPath;


// 与valueForKeyPath:方法同样取出对象,这里只对路径中的最后一个键调用setValue:ForKey:方法,并设置属性值为value。

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;


例:

Dog类:

@interface <span style="color:#cc0000;">Dog</span> : NSObject
// 狗的品种
@property (nonatomic, copy) NSString *name;

@end
Person类:
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface <span style="color:#cc0000;">Person</span> : NSObject

// 姓名
@property (nonatomic, copy) NSString *name;

// 年龄
@property (nonatomic, assign) int age;

// 电子邮件
@property (nonatomic, copy) NSString *email;

@property (nonatomic, strong) Dog *dog;

@end
main函数:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
   Person *p1 = [[Person alloc] init];
   // @"dog.name" 这个就叫做keyPath 或者叫 "属性的路径"
   [p1 setValue:@"哈士猫" forKeyPath:@"dog.name"];
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; line-height: normal; font-family: Menlo; color: rgb(52, 149, 175);"><span style="font-variant-ligatures: no-common-ligatures; color: #000000"> </span>NSString<span style="font-variant-ligatures: no-common-ligatures; color: #000000"> *dogName = [p1 </span>valueForKeyPath<span style="font-variant-ligatures: no-common-ligatures; color: #000000">:</span><span style="font-variant-ligatures: no-common-ligatures; color: #b4261a">@"dog.name"</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000">];</span></p>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// 根据字典的键,找对应的属性,为属性赋值(字典转模型

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;


#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
   Person *p1 = [[Person alloc] init];
  NSDictionary *bz = @{
                             @"name" : @"小明",
                             @"age" : @28,
                             @"email" : @"rzc0714@163.com",
                             @"dog" : @{@"name" : @"加肥猫"}
                             };
        
   [p1 setValuesForKeysWithDictionary:bz];

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// 把对象转成字典

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;

   // 把对象转成字典
        NSDictionary *dict = [p1 dictionaryWithValuesForKeys:@[@"name", @"age", @"email", @"dog"]];





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值