KVC使用场景总结

本文总结了KVC在iOS开发中的多种应用场景,包括简单的公有和私有属性赋值、复杂属性赋值、添加私有成员变量、字典与模型之间的转换及异常处理等。

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

KVC使用场景总结

1.KVC简单赋值(公有、私有属性)

 Boy.h

#import <Foundation/Foundation.h>

@interface Boy : NSObject

@property(nonatomic,strong) NSString *name;
@property(nonatomic,assign) NSInteger age;
@property(nonatomic,strong) NSString *city;

- (void)logTest;

@end
  Boy.m

#import "Boy.h"

@interface Boy ()

@property(nonatomic,strong) NSString *sport;

@end

@implementation Boy

- (void)logTest{
    NSLog(@"sport : %@",self.sport);
}

@end
  在 vc 中使用 kvc

- (void)kvcLearn{
    
    Boy *jack = [[Boy alloc] init];
    
    [jack setValue:@"Jack" forKey:@"name"];
    [jack setValue:@"18" forKey:@"age"];
    [jack setValue:@"football" forKey:@"sport"];
    
    NSLog(@"jack.name : %@",jack.name);
    NSLog(@"jack.age : %ld",jack.age);
    [jack logTest];
    NSLog(@"jack.sport : %@",[jack valueForKey:@"sport"]);
}
  可以访问并使用公私有属性。


2.复杂属性赋值

当 Boy 有一个其它类型属性 Book 的属性时候:

    Boy *jack = [[Boy alloc] init];
    jack.book = [[Book alloc] init];
    
    [jack.book setValue:@"iOS" forKeyPath:@"name"]; //方式一
    [jack setValue:@"C++" forKeyPath:@"book.name"]; //方式二

3.添加私有成员变量

[jack setValue:@"182" forKeyPath:@"_height"];


4.字典转模型

    NSDictionary *dic = @{@"name":@"book", @"num" : @"66"};
    GoodModel *model = [[GoodModel alloc] init];
    
    [model setValuesForKeysWithDictionary:dic];
    
    NSLog(@"model.name : %@",model.name);
    NSLog(@"model.num : %@",model.num);
但是,如果 model 属性和 dic 不匹配会怎样?
第一种情况,model多一个属性:这样程序没问题,model多出的属性会是nil

第二种情况,model少一个属性:程序会崩溃

第三种情况,model的属性名字和dic的key不匹配 : 程序会崩溃

  第二种和第三种崩溃的解决办法是重写方法  -(void)setValue:(id)value forUndefinedKey:(NSString *)key

例如下面:

GoodModel.h

#import <Foundation/Foundation.h>

@interface GoodModel : NSObject

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *num;
@property(nonatomic,copy) NSString *goodId;

@end

GoodModel.m

#import "GoodModel.h"

@implementation GoodModel

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    if([key isEqualToString:@"id"]){
        self.goodId = (NSString *)value;
    }
}

@end

VC中

    NSDictionary *dic = @{@"name":@"book", @"num" : @"66", @"id":@"123"};
    GoodModel *model = [[GoodModel alloc] init];
    
    [model setValuesForKeysWithDictionary:dic];
    
    NSLog(@"model.name : %@",model.name);
    NSLog(@"model.num : %@",model.num);
    NSLog(@"model.goodId : %@",model.goodId);
这样就实现了把 dic 中 id 数据赋值给了 model 中的 goodId。

5.模型转字典

    NSDictionary *dic = @{@"name":@"book", @"num" : @"66", @"id":@"123"};
    GoodModel *model = [[GoodModel alloc] init];
    
    [model setValuesForKeysWithDictionary:dic];
    
    NSDictionary *modelDic = [model dictionaryWithValuesForKeys:@[@"name",@"num",@"goodId"]];
    NSLog(@"modelDic : %@", modelDic);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值