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.第三点中的崩溃问题,我就用实际測试效果来解释:
KVC在定义Model类中的妙用的更多相关文章
- swift 第十一课 结构体定义model类
结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Mode ...
- hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)
hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...
- @JsonView注解指定返回的model类中显示的字段
1.User类 package com.imooc.model; import com.fasterxml.jackson.annotation.JsonView; /** * @author oy ...
- swift 第五课 定义model类 和 导航栏隐藏返回标题
1. 网络请求返回数据时候,把数据转化为model,但是有时候会返回空的字符串,所以加载了个长度的判断: class Model : NSObject{ var details_url:String? ...
- laravel中model类中好用的方法
public function field() { return $this->belongsTo(HrmAuthFieldsModel::class, 'filed_id', 'id'); } ...
- Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。
返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...
- 构建自己的PHP框架--实现Model类(1)
在之前的博客中,我们定义了ORM的接口,以及决定了使用PDO去实现.最后我们提到会有一个Model类实现ModelInterface接口. 现在我们来实现这个接口,如下: <?php names ...
- odoo 基于SQL View视图的model类
在做odoo的过程中,会涉及到多表的查询, 尤其是做报表的时候这种情况更甚,这样下来会做很多的关联,不是很方便.odoo提供了一种机制,即基于视图的model类.代码地址在这里. 具体过程如下: 1. ...
- python 经验:把全局变量放在一个类中
注:红色是我增加的注释 add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况. 我们应尽量不用全局变量 ...
随机推荐
- Mysql ORM工具--MicrobeORM.Mysql开源咯
MicrobeORM.Mysql 补充:为啥批批量比官方的ADO.NET还快,原因是这俩货 System.EnterpriseServices.dllSystem.EnterpriseServices ...
- poj 1276 Cash Machine_多重背包
题意:略 多重背包 #include <iostream> #include<cstring> #include<cstdio> using namespace s ...
- node.async.auto
资料 GITHUB async ASYNC详解—from csdn nodejs的高性能与灵活性让服务端开发变得有了些乐趣,最近在看nodejs在服务端的一些应用,觉得其npm下的众多开源包让其虽没有 ...
- Unity 之 AfterFixedUpdate,在所有 GameObject FixedUpdate 后执行
目的 FixedUpdate 在不同的 GameObject 互相之间是没有执行顺序的,我们并不能知道哪个 GameObject 先执行 FixedUpdate. 但是,有的时候我们仍然希望某个 Ga ...
- 【刷题 Python Tip】题目1~5
[题目1]just print a+b give you two var a and b, print the value of a+b, just do it!! print (a + b) [题目 ...
- iOS 原生地图 开发
iOS开发有时候用到地图,不少人第一想到的是用第三方.当然有时候为了和安卓同步,可能会一起使用某一第三方.但有时候,我们是可以用原生地图开发的.上面两个示意图是原生地图的自定义开发.运行demo,将展 ...
- Docker自学资源
1. Docker 的官方文档和博客: Docker官方文档 Docker Blog(官方博客 ) 2. Docker中文这区 网站上的[Docker手册]以及[Docker ppt]两个栏目有 Do ...
- Hibernate征途(一)之初识
相见恨晚 很久以前,大概从开始接触数据库开始,就闪过这样一个想法,怎么看怎么觉得数据库表和vb的类模块很像,不是么?除了vb类模块还有函数外:越往下学觉得二者越像,尤其在三层时学到实体类的概念,我去, ...
- 让rdlc报表在ReportViewer中水平居中的方法
正常情况下,rdlc报表在Reportviewer中是居左显示的,如图: 在Reporviewer的属性中,我没有找到能让rdlc的居中显示的方法.网上其他人用的方法都试了,没能实现,只能自己找方法解 ...
- 关于ASP.NET中的负载均衡
ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同一 ...