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

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

hot3.png

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

           @先来看一段代码:

[objc] 

  1. #import <Foundation/Foundation.h>  

  2.   

  3.  MDCAllShopObjectModel : NSObject  

  4.   

  5. //  定义全部商铺信息类要显示的内容的属性  

  6. @property (nonatomiccopy)      NSString *name;               //  商店名  

  7. @property (nonatomiccopy)      NSString *businessId;         //  属性商铺id  

  8. @property (nonatomiccopy)      NSString *address;            //  商铺地址  

  9. @property (nonatomiccopy)      NSString *telephone;          //  商铺电话  

  10. @property (nonatomiccopy)      NSString *business_id;        //  KVC商铺id  

  11. /** 

  12.  *  自定义一个商点信息类的初始化方法 

  13.  * 

  14.  *  @param dic 解析出来的团购商店的数据是字典 

  15.  * 

  16.  *  @return 商店对象 

  17.  */  

  18. -(id)initWithDictionary:(NSDictionary *)dic;  

  19.   

  20. /** 

  21.  *  KVC赋值方式 

  22.  * 

  23.  *  @param KVCDic 解析出来的团购商店的数据是字典 

  24.  * 

  25.  *  @return 商店对象 

  26.  */  

  27. - (id)initWithKVCDictionary:(NSDictionary *)KVCDic;  

  28.   

  29. @end  

[objc] 

  1. #import "MDCAllShopObjectModel.h"  

  2.   

  3. @implementation MDCAllShopObjectModel  

  4.   

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

  6.   

  7.     if (self = [super init]) {  

  8.           

  9.         self.name        = dic[@"name"];  

  10.         self.businessId  = [dic[@"business_id"] stringValue];  

  11.         self.address     = dic[@"address"];  

  12.         self.telephone   = dic[@"telehpone"];  

  13.       

  14.     }  

  15.       

  16.     return self;  

  17.   

  18. }  

  19.   

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

  21.    

  22.     if (self = [super init]) {  

  23.   

  24.         [self setValuesForKeysWithDictionary:KVCDic];  

  25.           

  26.     }  

  27.   

  28.     return self;  

  29. }  

  30.   

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

  32.   

  33.     NSLog(@"key = %@",key);  

  34. }  

            @先看.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方法解决,举例:

[objc] 

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

  2.       

  3.     //  当大众点评接口属性商店id不是"bussine_id"而是"id"时,"id"不兼容键值编码  

  4.     if([key isEqualToString:@"id"]){  

  5.       

  6.         self.bussine_id = value;  

  7.     }  

  8.   

  9. }  

           5.第三点中的崩溃问题,我就用实际测试效果来解释:

转载于:https://my.oschina.net/MyFirstApp/blog/533859

你可能感兴趣的文章
正则表达式基本语法
查看>>
Sniffing with Wireshark as a Non-Root Use
查看>>
接口与抽象类的区别
查看>>
一对都吃路边摊的情侣为何最终没有走到一起?
查看>>
JS返回父级页面和上上级页面
查看>>
js call
查看>>
hibernate DetachedCriteria连接关联查询
查看>>
【解决】 [INS-06101] IP address of localhost could not be determined
查看>>
Win7 开发WCF时 提示 进程不具有此命名空间的访问权限
查看>>
Netscaler GSLB的主备数据中心解决方案
查看>>
sublime3快捷键分类总结
查看>>
google calendar的替代品
查看>>
fedora22升级到fedora23(转)
查看>>
2012.Net架构必备工具列表
查看>>
ASP.NET MVC3、Pager 分页
查看>>
Nagios的安装
查看>>
Nagios中官方iptables监控脚本调整
查看>>
OSI七层模型
查看>>
系统压力测试sysbench
查看>>
认识计算机病毒,保护自己免受经济损失
查看>>