博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KVC在定义Model类中的妙用
阅读量:7039 次
发布时间:2019-06-28

本文共 2352 字,大约阅读时间需要 7 分钟。

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

           @先来看一段代码:

#import 
@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

#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"等系统keyword的时候,也能通过forUndefinedKey方法解决,举例:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key  {        //  当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码    if([key isEqualToString:@"id"]){            self.bussine_id = value;    }}
           5.第三点中的崩溃问题,我就用实际測试效果来解释:

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5220055.html,如需转载请自行联系原作者

你可能感兴趣的文章
MySQL · 物理备份 · Percona XtraBackup 备份原理
查看>>
The total number of locks exceeds the lock table size错误(已纠正)
查看>>
Java千百问_05面向对象(005)_接口和抽象类有什么区别
查看>>
c++虚函数表探究
查看>>
java自定义注解
查看>>
Zend的Registry机制
查看>>
MySQL内核月报 2014.10-MySQL· 捉虫动态·崩溃恢复失败
查看>>
IOS开发之绝对布局和相对布局(屏幕适配)
查看>>
算法设计与分析 上机题Mergesort
查看>>
WinForm 清空界面控件值的小技巧
查看>>
jQuery源码-dom操作之jQuery.fn.html
查看>>
IOS bug之Code Sign error:Provisioning profile
查看>>
Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
查看>>
Xcode连接git@osc
查看>>
【Oracle】Current online Redo 和 Undo 损坏的处理方法
查看>>
TLTagsControl
查看>>
Linux内核中SPI总线驱动分析
查看>>
Java8中CAS的增强
查看>>
C语言之将无符号字符型转化为ascii码值
查看>>
maven2完全使用手册
查看>>