zoukankan      html  css  js  c++  java
  • 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

    #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.第三点中的崩溃问题,我就用实际測试效果来解释:





  • 相关阅读:
    WSL下的Ubuntu 18.04LTS配置软件源和系统更新
    宝塔 5.9.2 最终版 专业版
    宝塔面板7.2.0学习版集合--包含(专业版、企业版及部分插件)
    网络安全学习和CTF必不可少的一些网站
    Hello Blog !
    如何解决机器学习树集成模型的解释性问题
    机器学习建模老司机的几点思考与总结
    2019 秋招提前批蘑菇街一面面经(带答案)
    Java 最全异常讲解
    Spring Context 你真的懂了吗
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5220055.html
Copyright © 2011-2022 走看看