KVC使用场景总结

来源:互联网 发布:如何做好淘宝售后服务 编辑:程序博客网 时间:2024/06/07 00:56

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);





原创粉丝点击