http://www.bkjia.com/IOSjc/989396.html

熟练使用KVC 可以再开发过程中可以给我们带来巨大的好处,尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的代码堆积。减少代码量就是减少出错的概率。KVC 用起来很灵活,这种灵活的基础是严格的命名要求。这种命名要求其实是一种约定。再程序的世界里,约定的作用远远大于开发本身,良好的约定可以使程序员摆脱很多判断,也减少了错误。KVC有如下几点作用:

1)、直接赋值

使用KVC 可以对对象的某个属性进行赋值。假定现在我们有一个Person 类,类中包含两个属性:一个是只读的name 属性,一个是Number类型的age属性。

//
//  Person.h
//  KVC
//
//  Created by 邓竹立 on 15-4-24.
//  Copyright (c) 2015年 GiveMeFive. All rights reserved.
//#import <Foundation/Foundation.h>@interface Person : NSObject@property(nonatomic,copy,readonly)NSString* name;@property(nonatomic,assign)NSNumber *age;@end

当我们定义了属性的时候,系统就为我们自动的生成了setter 和getter 方法。我们可以通过setter 和getter方法,或读取或写入数值。当然我们也可以用KVC 的方式进行读写数据。先看一下代码,然后我们再简述一下需要注意的问题。

#import "ViewController.h"
#import "Person.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad
{[super viewDidLoad];Person *person=[[Person alloc] init];[person setValue:@"25" forKey:@"age"];[person setValue:@"皮拉夫大王" forKey:@"name"];NSLog(@"person 的名字是%@",person.name);NSLog(@"person 的年领是%@",[person valueForKey:@"age"]);
}@end

2015-04-24 20:40:13.286 KVC[6208:218095] person 的名字是皮拉夫大王

2015-04-24 20:40:13.287 KVC[6208:218095] person 的年领是25

如果你没有接触过KVC 的话,你大概会想:我擦,大王的脑子坏掉了吧?只读的属性怎么可以赋值?!还有age属性明明是NSNumber类型的,怎么可以把字符串赋给它?!没错,这就是我想说的,KVC 不但能够赋值,而且还能破坏只读的特性。当然这只是我们需要注意的一个细节,更重要的是KVC 有自动装箱(自动类型转换)的功能,我们不需要去转换类型了。由于开发过程中数据领域是字符串的天下,所以这个自动装箱的功能的确是极好的。

2)、支持键值路径

什么叫支持键值路径?说白了就是支持嵌套。假如现在有一个书籍类,类中包含了书籍的名称name。书籍可以被Person所拥有(就是可以作为person的属性)

#import <Foundation/Foundation.h>@interface Book : NSObject@property(nonatomic,copy)NSString* name;@end

那么我们就可以这样来用

    Person *person=[[Person alloc] init];Book *myBook=[[Book alloc] init];person.book=myBook;[person setValue:@"程序员摊煎饼指南" forKeyPath:@"book.name"];NSLog(@"%@",[person valueForKeyPath:@"book.name"]);

这里的key直接使用点局分开就好了,注意一下:这里使用的时keyPath,当然在   “ 1)属性赋值”   中我们也可以使用keyPath,只不过再不必要的情况下使用keyPath会浪费性能而已。这里没啥可说的了,说多了都对不起我一度5毛的电费。

3)支持操作符

假如我们有10个字符串,我们想求出这10个字符串的总长度,我们可以使用KVC提供的操作符。

NSArray *books=@[@"鸟哥烧烤私房菜",@"程序员摊煎饼宝典",@"麻辣烫基础教程"];
NSLog(@"%@",[books valueForKeyPath:@"@sum.length"]);

这里的@sum 是KVC 提供的,不是我们写的。像这样的函数共有5个@avg,@count,@max,@min,@sum。我们直接用就可以了。但是据说效率比用for循环慢。我没有测试过,感兴趣的话你可以测试一下。

4)错误拦截

对于我们前端程序员来说,后端程序员有时也是一个troubleMaker。他总是给你传递一些很奇怪的东西。比如给你传递一个id 属性,或者什么都不给你传。如果有这样一个json文件 {“id”:"1"}。这是逼着我们把id作为数据模型的一个属性的节奏啊!!老夫不愿意啊!尽管作为属性也不会报错。屈服?还是抗争?这是一个问题。但是好在前辈们已经给了我们答案。假如我们有一个Model类,类中的whoCare属性就是本应命名为id 的属性。我们还写了一个字典转模型的初始化方法。

@interface Model : NSObject@property(nonatomic,strong)id whoCare;-(instancetype)initWithDict:(NSDictionary *)dict;@end

那么我们可以在.m文件中重写 -(void)setValue:(id)value forUndefinedKey:(NSString *)key 方法。这个方法会在字典转模型时,系统找不到同名的属性时调用。所以我们可以再这个方法中进行错误拦截,并进行赋值操作,这样就不会报错了。

#import "Model.h"@implementation Model-(instancetype)initWithDict:(NSDictionary *)dict
{if (self=[super init]){//忘了介绍了 字典转模型的常用语句[self setValuesForKeysWithDictionary:dict];}return self;
}-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{if ([key isEqualToString:@"id"]){self.whoCare=value;}
}@end

写好了模型类,我们可以来测试一下。

#import "Model.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad
{[super viewDidLoad];NSDictionary *dict=@{@"id":@"1"};Model *model=[[Model alloc] initWithDict:dict];NSLog(@"%@",model.whoCare);
}@end

程序没有崩溃,而且赋值成功。不信你看打印信息

2015-04-24 21:12:00.676 KVC[6393:228807] 1

iOS 高级开发 KVC(一),ios开发kvc相关推荐

  1. iOS高级进阶系列之项目开发基础(上)多环境配置,Mach-O与链接器。

    前言 最近对项目进行优化,就顺便写一些日常开发中会用到的中高级开发技巧.这篇文章聊一下下面三个内容:多环境配置,Mach-O与链接器,Symbol. 多环境配置 聊到多环境配置,我们先说几个概念 上图 ...

  2. 2020年 面向高级开发人员的 iOS面试问题

    在本文中,您将找到针对高级开发人员的iOS面试问题和解答. 当您准备进行技术性的iOS面试时,重要的是要了解您可能会被问到的话题以及经验丰富的iOS开发人员的期望.这些问题被许多公司用来衡量iOS候选 ...

  3. ios非常全的库iOS开发 非常全的三方库、插件、大牛博客等等

    转自: TimLiu-iOS Swift版本点击这里欢迎加入交QQ流群: 594119878 github排名 https://github.com/trending,github搜索:https:/ ...

  4. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  5. iOS客户端开发与Web前端开发

    来源:Bang 不知不觉做iOS客户端开发已经半年多了,了解到iOS客户端开发与Web前端开发的一些异同,写一下. 1.版本升级.用户角度上看,客户端升级必须让用户手动下载整个新的安装包覆盖安装,而w ...

  6. Xamarin Mono For Android 4.10.01068 完整离线安装破解版(C#开发Android、IOS工具)

    Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Micro ...

  7. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

    Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Micro ...

  8. html脚本ios调试不了,Safari 前端开发调试 iOS 完美解决方案(iPhone/iTouch 等)

    在日趋现代化的 Web 网络中,各种现代浏览器和移动终端设备的用户百分比越来越高.对于我们 Web 前端开发者来说,运行 iOS Safari 浏览器的苹果移动设备对我们来说更是不容忽视的.然而当我们 ...

  9. iphone开发教程(1) iOS大纲

    iOS 大纲 iOS 由操作系统和应用技术构成.虽然和 Mac OS X 共用了很多技术,但是 iOS 是专门为了移动设备而设计的.当然如果你以前做过 Mac OS X 的应用程序,你会发现很多相似之 ...

  10. FFmpeg音视频开发实战5 iOS/Android/windows/Linux -陈超-专题视频课程

    FFmpeg音视频开发实战5 iOS/Android/windows/Linux -159618人已学习 课程介绍          咨询QQ: 347181469. 本课程适合中,从事音视频,网络通 ...

最新文章

  1. 标题1100: 简略计算器
  2. JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
  3. 基于ARM的linux嵌入式操作系统
  4. Dropout的前世与今生
  5. bashrc文件中环境变量配置错误,导致linux命令无法正常使用的解决方案
  6. 前端框架:发送请求获取数据的执行逻辑
  7. linux卸载gd,linux下 安装GD
  8. Docker-Compose快速搭建Oracle-11G系统
  9. 2019年网络规划设计师上午真题及答案解析
  10. 基于浏览器父子窗口值传递
  11. mysql clomn_mysql 命令总结
  12. mysql 主从的作用_MySQL主从复制作用和原理
  13. leetcode刷题正则表达式
  14. arcgis api for js入门开发系列四地图查询
  15. Graph_editor——好用的画图软件,你会用吗?
  16. eplan2.5安装教程
  17. 正交匹配追踪算法OMP
  18. mac下搭建stm32开发环境
  19. 【观察】海外本地化机遇与挑战并存,跨境电商如何跑出“加速度”?
  20. 微信的优缺点以及发展史

热门文章

  1. nano云存储 java,Nano云存储静态文件存储CDN和WDCDN免费CDN加速
  2. python 通讯录课程设计_如何用Python设计一个通讯录类?
  3. VUE之组件(插槽slot与可复用组件)
  4. 并行计算与集群技术(3)
  5. python3字典合并_Python3.9中的字典合并和更新,几乎影响了所有Python程序员
  6. python海龟漂亮图案代码大全_Python:海龟绘图(六)——来点颜色看看
  7. 2022最强金九银十软件测试自动化测试,建议进收藏夹
  8. SOLIDWORKS工程图转DWG字体乱码怎么办?
  9. 勿忘初心,继续coding
  10. 单片机彩灯c语言程序设计,(定稿)毕业论文基于AT89C51单片机的LED彩灯控制器设计(完整版)...