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

KVC在定义Model类中的妙用的更多相关文章

  1. swift 第十一课 结构体定义model类

    结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Mode ...

  2. hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

    hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

  3. @JsonView注解指定返回的model类中显示的字段

    1.User类 package com.imooc.model; import com.fasterxml.jackson.annotation.JsonView; /** * @author oy ...

  4. swift 第五课 定义model类 和 导航栏隐藏返回标题

    1. 网络请求返回数据时候,把数据转化为model,但是有时候会返回空的字符串,所以加载了个长度的判断: class Model : NSObject{ var details_url:String? ...

  5. laravel中model类中好用的方法

    public function field() { return $this->belongsTo(HrmAuthFieldsModel::class, 'filed_id', 'id'); } ...

  6. Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。

    返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...

  7. 构建自己的PHP框架--实现Model类(1)

    在之前的博客中,我们定义了ORM的接口,以及决定了使用PDO去实现.最后我们提到会有一个Model类实现ModelInterface接口. 现在我们来实现这个接口,如下: <?php names ...

  8. odoo 基于SQL View视图的model类

    在做odoo的过程中,会涉及到多表的查询, 尤其是做报表的时候这种情况更甚,这样下来会做很多的关联,不是很方便.odoo提供了一种机制,即基于视图的model类.代码地址在这里. 具体过程如下: 1. ...

  9. python 经验:把全局变量放在一个类中

    注:红色是我增加的注释 add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况. 我们应尽量不用全局变量 ...

随机推荐

  1. Android doGet方法

    DefaultHttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet("http://w ...

  2. C读txt到二维数组

    #include<stdio.h> #include<stdlib.h> #define maxn 200 void main() { FILE *fp; int s[maxn ...

  3. sed简单实例练习

    sedfile内容如下: Steve Blenheim:238-923-7366:95 Latham Lane, Easton, PA 83755:11/12/56:20300 Betty Boop: ...

  4. jquery的clone办法bug修复

    发现测试,textarea和select的jquery的clone有问题的方法,textarea和select值clone时间会输.这是发现jquery一个bug,上不了的能够看下代码.比較简单.就是 ...

  5. UIPageViewController跳跃切换的问题

    使用的是XHScrollMenu和UIPageViewController来构建5个页面: ViewController1, ViewController2, ViewController3, Vie ...

  6. 连接时出现:Can&#39;t open display: localhost:10.0

    解决方法: 在/etc/hosts 中增加 127.0.0.1 localhost ipaddress hostname 之后能进入图形界面,注意是实际ip和机器名 $(function () { $ ...

  7. Ror初学笔记

    Ror正在以惊人的速度增长着,特别是在常常光顾JavaEye的时候发现Ror已经在国内有非常好的基础了,当然要凑个热闹尝尝鲜 咯. 眼下国内Ror的中文资料还是非常少的,到网上找找就仅仅有Eiffel ...

  8. PHP 生成UUID的方法

                                                    .                 .                 .                ...

  9. 【单点更新,区间查询,线段树】【HDU1166】【敌兵布阵】

    线段树要捡回来学了 才知道以前抄的模板就是杭电传奇学长写的,写起来更有激情了: 一点注意: 单点更新完后记得pushup(),向上更新信息 以下是对线段树的理解 线段树的节点代表一段线段,节点编号没有 ...

  10. web项目中获取各种路径的方法

    ~Apple   web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/&qu ...