KVC在定义Model类中的使用

@我们应用程序使用MVC架构的话,对于处理数据类,我们会单独的定义Model类,在里面为要展示的属性进行初始化赋值,一般采用的方法是通过定义对应的属性,挨个赋值.现在我要介绍的就是通过KVC,key-value的方式,进行赋值.
@先来看一段代码:

#import <Foundation/Foundation.h>  

@interface MDCAllShopObjectModel : NSObject  

//  定义全部商铺信息类要显示的内容的属性  
@property (nonatomic, copy)      NSString *name;               //  商店名  
@property (nonatomic, copy)      NSString *businessId;         //  属性商铺id  
@property (nonatomic, copy)      NSString *address;            //  商铺地址  
@property (nonatomic, copy)      NSString *telephone;          //  商铺电话  
@property (nonatomic, copy)      NSString *business_id;        //  KVC商铺id  
/** 
 *  自定义一个商点信息类的初始化方法 
 * 
 *  @param dic 解析出来的团购商店的数据是字典 
 * 
 *  @return 商店对象 
 */  
-(id)initWithDictionary:(NSDictionary *)dic;  

/** 
 *  KVC赋值方式 
 * 
 *  @param KVCDic 解析出来的团购商店的数据是字典 
 * 
 *  @return 商店对象 
 */  
- (id)initWithKVCDictionary:(NSDictionary *)KVCDic;  

@end  

[objc] view plaincopy
#import "MDCAllShopObjectModel.h"  

@implementation MDCAllShopObjectModel  

- (id)initWithDictionary:(NSDictionary *)dic{  

    if (self = [super init]) {  

        self.name        = dic[@"name"];  
        self.businessId  = [dic[@"business_id"] stringValue];  
        self.address     = dic[@"address"];  
        self.telephone   = dic[@"telehpone"];  

    }  

    return self;  

}  

- (id)initWithKVCDictionary:(NSDictionary *)KVCDic{  

    if (self = [super init]) {  

        [self setValuesForKeysWithDictionary:KVCDic];  

    }  

    return self;  
}  

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{  

    NSLog(@"key = %@",key);  
}  
        @先看.h文件,我定义了2个商店ID属性来展示区别.先声明:大众点评接口中返回的数据id是"business_id".
        1.当用属性方式赋值的时候,所取的属性名可以不与请求数据中的属性名相同;而用KVC方式赋值的时候,则必须完全相同,切记,大小写都不能错.
        2.用属性方式赋值,所定义的属性数量很自由,你需要用到什么就定义什么,不受请求数据接口返回数据的属性数量限制;而用KVC方式赋值,setValuesForKeysWithDictionary方法会遍历请求到的字典中的所有属性,所有的key都会一一对应的赋值,这个时候,也就要求你在Model中定义所有的属性来接收.
        3.KVC方式赋值比较方便,毕竟就一句话嘛,但是为了解决2中的问题,就需要用到- (void)setValue:(id)value forUndefinedKey:(NSString *)key这个方法了,当你实现了这个方法,你就也能在用KVC方式赋值的时候,只定义自己需要的属性了,因为当setValuesForKeysWithDictionary找不到对应的key时,程序则会调用forUndefinedKey这个方法,将key对应的值存入到value中,这样,程序就不会崩溃了.
        4.当你请求的数据中有"id",""description"等系统关键字的时候,也能通过forUndefinedKey方法解决,举例:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key  {  

    //  当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码  
    if([key isEqualToString:@"id"]){  

        self.bussine_id = value;  
    }  

}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值