[iOS]开发之-字典转模型和KVC

需求一:将字典转换成自己需的对象,对象的属性是字典的key值,直接使用key值获取数据存在两个缺点,一是key值难以记忆,二是直接使用key值Xcode不会有智能提示,很容易导致未知的错误。使用模型时,可以直接通过点语法将需要的数据点出,保证数据准确无误。使用模型的优点还在于存储、传值都比较方便,不容易出错。最主要的是这也符合我们MVC和MVVM的设计模式。

注意:要使用模型就离不开KVC,假如我们从外界传入一个字典,字典中有两个 key对应的值是我们需要的,这两个值分别是 “name”、“age”。要使用KVC的时候要注意模型的属性一定要和字典中的key值相对应。比如字典中的“name”,那模型中就必须有一个name的属性。这样就可以使用KVC了,KVC的两种方法:(下文都默认我们有两个模型属性,分别是name和age,传入的字典默认为dict)

1. setValue(模型属性, forKey:字典的key值)

eg:setValue(self.name, forKey:dict[“name”])

*这种赋值方法很麻烦,每需要一个key值就要打一遍该方法。这样的赋值方式就和self.name = dict[“name”] 的区别不是太大

2. setValuesForKeysWithDictionary(传入的字典)

eg: setValuesForKeysWithDictionary(dict)

*直接完成赋值,其实setValuesForKeysWithDictionary(传入的字典),它默认也是调用setValue(模型属性, forKey:字典的key值 ),遍历字典一一给模型属性赋值。所以使用KVC时就要求模型的属性必须喝字典的key值一一对应。

需求二:如果我们只想使用字典中的部分值呢?一个大字典,里面有好几十个key,难道我们还要在模型中根据key值定义几十个属性么?当然我们程序猿都是很懒的,肯定不会定义这么多key值的,此时我们只需重写KVC的以下方法就行了:

3.setValue(value: AnyObject?, forUndefinedKey key: String)

*这个方法会帮我们过滤我们没有的key值,值执行 setValuesForKeysWithDictionary(dict)时,当监测出我们没有字典中key值所对应的属性时就会调用这个方法。

*重写时里面不需要写任何代码,如果想打印哪些key值我们没有时就可以在里面打印。

需求三:我们知道很多字典中都有“id”这个key值。而“id”在我们iOS中是个数据类型,显然不能将“id”当作模型属性名称去定义。此时我们只需要随意定义一个属性名去保存“id”,当然为了更已读、严谨一些,我们一般还是定义为“ID”最为恰当。而我们知道要使用KVC就要key值和模型名一一对应,但是我们就是想要获取“id”。此时需要将“需求一”和“需求二”结合起来看了。我们在获取“id”时,直接使用传入的字典赋值:(此时我们新添一个属性“ID”)

eg :self.ID = dict[“id”]

*当这样赋值之后就取出”id “所对应的value了。

但是我们还要获取其他的value呢,此时在使用 setValuesForKeysWithDictionary(dict)完成其他属性的赋值。当然也需要重写setValue(value: AnyObject?, forUndefinedKey key: String)方法,因为字典中并有“ID”这个key值(字典中是“id”,“ID”是模型新定义的属性)。完整代码如下 :

swift:

override init() {

super.init()

self.ID = dict[@"id”];

setValuesForKeysWithDictionary(dict)

}

override func setValue(value: AnyObject?, forUndefinedKey key: String) { }

OC:

+ (instancetype) testWithDict:(NSDictionary *)dict{

TEST *test = [[TEST alloc]init];

test.ID = dict[@"id"];

[test setValuesForKeysWithDictionary:dict];

return test;

}

?

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

}

?

*注意当在对象方法使用KVC时一定要先super.init,因为要首先保证有一个对象存在,这样才能访问这个对象的属性。

*注意在使用对象方法时,命名方法名时“With”中的“W”必须大写,否则无法完成super.init

eg:- (instancetype) initWithDict:(NSDictionary *)dict

补充:KVC强大不仅仅只在于给模型赋值,KVC还可给只读 属性赋值,改变私有属性。比如UITabBarController中tabBar是只读属性,用一般的赋值时无法给只读属性赋值的,但是通过

setValue(value,forKey:”属性名”)

eg:setValue(value,forKey:“tabBar”)

?

总结:KVC是Set Value Coding的简称,它是一种直接通过字符串的名字(key)来访问类属性的机制。而不是通过Setter(设置器)和Getter(读取器)。

时间: 2024-10-21 10:43:45

[iOS]开发之-字典转模型和KVC的相关文章

2、iOS 开发之字典转模型和 xib

一.字典转模型(plist文件) 模型的封装方法:(放到代码仓库中) 1.在.h文件中添加与plist文件key值对应的属性名 Array --- > NSArray Dictionary --- > NSDictionary string ---> NSString number ---> NSNumber 注意:属性名和plist中key值一定要一致 2..h文件文件中属性的strong weak copy assign的使用 1> strong : 用于一般的对象或自定

[iOS]关于 App 混合(Hybrid)开发的优化,包括H5、Weex等(本篇博客主要针对 iOS 应用讲解,但该思想同样适用于Android)

我们知道混合开发,可以节省很多成本(时间成本,经济成本等等),所以有很多公司比较钟爱这种开发形式,今天所讲的优化方式,也是我在我们公司的应用中实际用了的,而且我写的这个优化的 SDK 已经开源到 github 上了,有兴趣的同学可以下载来看一下,有不足的地方欢迎指正.这里给出链接:https://. 转载请注明出处:http://www.cnblogs.com/shisishao/p/6830736.html -.首先,先介绍下什么是混合开发: 我们通常把移动开发分为Web.Native和Hyb

[iOS] XML解析和xml转plist文件(GDataXML)

iOS对于XML的解析有系统自带的SDK--NSXMLParser,鄙人愚拙,只会用GDataXML进行解析,这里仅介绍GData的使用.(以下图为例) 1.对于一个xml文件,先读取出来 NSData *xmlData = [[NSFileManager defaultManager]contentsAtPath:[NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],@"test.x

[IOS]Swift 遍历预制的本地资源文件

我事先放了一堆svg文件,但是我是批量使用的,想要直接遍历他们加入到一个list中来,那我直接就遍历他们的名称,把他们的名字组成一个array. var ss:NSString = NSBundle.mainBundle().resourcePath!//6.0.1修改了要求感叹号 println(ss) var nsfilemange = NSFileManager.defaultManager() var filelist=NSArray.alloc() filelist=nsfileman

[转]iOS应用程序生命周期(前后台切换,应用的各种状态)详解

转载地址:http://blog.csdn.net/totogo2010/article/details/8048652 iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running

iOS第三方库汇总[转载]

iOS第三方库汇总[转载] 字数2179 阅读334 评论0 喜欢29 简介 此文用于总结,本人使用过或者收藏过的Github第三方类库,以便日后查阅,也便他人借鉴. 资料整理中不定期更新... 开源项目 CodeHub browse and maintain your GitHub repositories on any iOS device! Open-Source iOS Apps 开源iOS apps列表 APP相关 iVersion 提示版本更新 BonMot 字体相关的库,设置字体样

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

[转]在iOS项目中使用CorePlot框架

转载地址:http://blog.csdn.net/llfjfz/article/details/7849190#comments Core Plot是OS X和IOS下的一个开源图形库,它提供数据的可视化处理,就是画曲线图.柱状图和饼图等等.如何在项目中使用Core Plot的静态库呢?以下是几个步骤: 首先先去Google Code下载Core Plot图形库,网址 http://code.google.com/p/core-plot/ .目前该网址提供了CorePlot_1.0.zip下载

[转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. 1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2