iOS KVC(Key-Value Coding)
常见用法:
- 获取值
- valueForKey: 依据属性名取值
- valueForKeyPath: 依据路径取值(如:[person valueForKeyPath:@”car.price”])
- valueForUndefinedKey 默认实现是抛出异常。能够重写这个函数做错误处理 ( 比較少用 )
- 改动值
- setValue:forKey: 依据属性设值
- setValue:forKeyPath: 依据路径设值
- setValue:forUndefinedKey:
- setNilValueForKey: 当对非类对象属性设置nil时。调用。默认抛出异常
- 字典转模型
- setValuesForKeysWithDictionary: 字典转模型
上代码:
定义一个HSCar类
//
// HSCar.h
// KVC
//
// Created by hans on 15/7/13.
// Copyright © 2015年 hans. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface HSCar : NSObject
/** 名字 */
@property (nonatomic, copy) NSString *name;
/** 价格 */
@property (nonatomic, assign) double price;
@end
定义一个HSBook类
//
// HSBook.h
// KVC
//
// Created by hans on 15/7/13.
// Copyright © 2015年 hans. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface HSBook : NSObject
/** 书名 */
@property (nonatomic, copy) NSString *name;
/** 价格 */
@property (nonatomic, assign) double price;
@end
定义一个HSPerson类
//
// HSPerson.h
// KVC
//
// Created by hans on 15/7/13.
// Copyright © 2015年 hans. All rights reserved.
//
#import <Foundation/Foundation.h>
@class HSCar;
@interface HSPerson : NSObject
/** 名字 */
@property (nonatomic, copy) NSString *name;
/** 年龄 */
@property (nonatomic, copy) NSString *age;
/** 车 */
@property (nonatomic, strong) HSCar *car;
@end
//
// HSPerson.m
// KVC
//
// Created by hans on 15/7/13.
// Copyright © 2015年 hans. All rights reserved.
//
#import "HSPerson.h"
@implementation HSPerson
{
// 体重
double _weight;
}
- (void)showWeight
{
NSLog(@"weight: %f", _weight);
}
@end
在ViewController实现
//
// ViewController.m
// KVC
//
// Created by hans on 15/7/13.
// Copyright © 2015年 hans. All rights reserved.
//
#import "ViewController.h"
#import "HSPerson.h"
#import "HSCar.h"
#import "HSBook.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
HSPerson *person = [HSPerson new];
person.name = @"hans";
person.age = 23;
person.car = [HSCar new];
person.car.name = @"兰博基尼";
person.car.price = 10000000.0;
/** valueForKey: */
NSLog(@"name: %@ age: %@", [person valueForKey:@"name"], [person valueForKey:@"age"]);
// 2015-07-13 22:32:02.356 KVC[54356:872650] name: hans age: 23
/** valueForKeyPath: */
NSLog(@"name:%@ price: %@", [person valueForKeyPath:@"car.name"], [person valueForKeyPath:@"car.price"]);
// 2015-07-13 22:51:27.075 KVC[54669:885579] name:兰博基尼 price: 10000000
/** setValue:forKey: */
[person setValue:@"hanshhh" forKey:@"name"];
[person setValue:@"100" forKey:@"age"];
NSLog(@"name: %@ age: %@", [person valueForKey:@"name"], [person valueForKey:@"age"]);
// 2015-07-13 22:53:54.876 KVC[54709:886954] name: hanshhh age: 100
/** setValue:forKeyPath: */
[person setValue:@"法拉利" forKeyPath:@"car.name"];
[person setValue:@(9999999) forKeyPath:@"car.price"];
NSLog(@"name:%@ price: %@", [person valueForKeyPath:@"car.name"], [person valueForKeyPath:@"car.price"]);
// 2015-07-13 22:56:36.336 KVC[54767:888926] name:法拉利 price: 9999999
/** 更改私有属性 */
[person setValue:@(120) forKeyPath:@"_weight"];
[person showWeight];
// 2015-07-13 23:01:15.151 KVC[54847:892122] weight: 120.000000
/** 字典转模型 */
// 1.简单转换
NSDictionary *dict1 = @{
@"name" : @"汉斯",
@"age" : @"23",
};
[person setValuesForKeysWithDictionary:dict1];
NSLog(@"name : %@, age : %d", person.name, person.age);
// 2015-07-13 23:04:20.298 KVC[54943:895092] name : 汉斯, age : 23
// 2.复杂模型转换(注意:person.car不能转换。会变为字典对象,事实上就是简单的指针赋值而已)
NSDictionary *dict2 = @{
@"name" : @"汉斯哈哈哈",
@"age" : @"23",
@"car" : @{
@"name" : @"兰博基尼",
@"price" : @"10000000"
},
};
[person setValuesForKeysWithDictionary:dict2];
NSLog(@"%@", person.car);
// 2015-07-13 23:10:32.310 KVC[55019:899474] {
// name = "\U5170\U535a\U57fa\U5c3c";
// price = 10000000;
// }
/** 其它运算 */
HSBook *book1 = [HSBook new];
book1.name = @"结网";
book1.price = 51.0;
HSBook *book2 = [HSBook new];
book2.name = @"失控";
book2.price = 40.0;
HSBook *book3 = [HSBook new];
book3.name = @"异类";
book3.price = 60.0;
person.books = @[book1, book2, book3];
NSLog(@"%@", [person.books valueForKeyPath:@"@count"]);
NSLog(@"%@", [person.books valueForKeyPath:@"@avg.price"]);
NSLog(@"%@", [person.books valueForKeyPath:@"@min.price"]);
NSLog(@"%@", [person.books valueForKeyPath:@"@max.price"]);
// 2015-07-13 23:20:43.434 KVC[55171:905643] 3
// 2015-07-13 23:20:43.434 KVC[55171:905643] 50.333333333333333333333333333333333333
// 2015-07-13 23:20:43.435 KVC[55171:905643] 40
// 2015-07-13 23:20:43.435 KVC[55171:905643] 60
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
iOS KVC(Key-Value Coding)的更多相关文章
- xcode KVC:Key Value Coding 键值编码
赋值 // 能修改私有成员变量 - (void)setValue:(id)value forKey:(NSString *)key; - (void)setValue:(id)value forKey ...
- [iOS] KVC 和 KVO
开发iOS经常会看见KVO和KVC这两个概念,特地了解了一下. 我的新博客wossoneri.com link KVC Key Value Coding KVC是一种用间接方式访问类的属性的机制.比如 ...
- iOS KVC 和 KVO 区别简单总结
KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实 ...
- iOS key value coding kvc在接收json数据与 model封装中的使用
iOS key value coding kvc在接收json数据与 model封装中的使用 使用 kvc 能够极大的简化代码工作,及以后的接口维护工作: 1:先创建MovieModel类.h和 . ...
- iOS - KVC 键值编码
1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...
- iOS kvc
kvc在我的脑海里用来更改属性的实例变量值. 今天,他们遇到了kvc第二次去学习它,在网上看了很多博客,这似乎不符合我的口味,为了提取一些以下的.总结自己的. http://www.cnblogs.c ...
- iOS KVC setValuesForKeysWithDictionary的使用
Key Value Coding Key Value Coding是cocoa的一个标准组成部分,它能让我们可以通过name(key)的方式访问property, 不必调用明确的property ac ...
- iOS KVC 和 KVO 的学习
KVC (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种 ...
- iOS KVC详细讲解
iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取 ...
- 'NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value coding compliant
解决一个问题: 当我添加一个IBout, 报了如下错误 NSUnknownKeyException' … setValue:forUndefinedKey:]: …not key value codi ...
随机推荐
- boost::tuple 深入学习解说
#include<iostream> #include<string> #include<boost/tuple/tuple.hpp> #include<bo ...
- Solr 搜索的过程和所须要的參数
一个典型的搜索处理过程,以及所须要的參数例如以下: qt:指定一个RequestHandler,即/select.缺省是使用DisMax RequestHandler defType:选择一个quer ...
- NYOJ_94 cigarettes 递归VS迭代
题目地址 分析: 英文题事实上看懂意思和正常的也都差点儿相同.就算有几个单词不认识也无伤大雅. 一共同拥有n支烟,每天抽k支. 每抽完k支,会得到一仅仅. a组数据. 输入n k的个数.输出一共抽了 ...
- iframe是否缓存页面探究
近期手里有个项目须要用iframe来调用每天都会变化的页面,后来想到iframe会不会缓存页面呢.于是写了个demo论证了下,结果例如以下: iframe的src假设是静态页面,就有可能会缓存.由于静 ...
- android一个弹出菜单的动画(一)
先上效果图: 先写Layout文件: <?xml version="1.0" encoding="utf-8"? > <RelativeLay ...
- 2016.02.23,英语,《Vocabulary Builder》Unit 01
Bell:来源于拉丁语,含义为war.fight,其中Bellona [bә'lәunә]是罗马女战神的名字,她的丈夫是战神Mars.antebellum: [ˌænti'beləm] adj. 战前 ...
- C9---include,编译
//main.c //include基本概念 //include是预处理指令,翻译之前会替换,编译之前左的处理,#都是预处理指令,翻译时候会添加别的内容进来. #include <stdio.h ...
- 解决 Eclipse 导入项目后 Maven Dependencies missing jar 问题
转自:https://yq.aliyun.com/ziliao/314086 话不多说直接上图 上图是我通过git导入项目后, Maven Dependencies Library中很多包出现miss ...
- 学习supervisor
学习supervisor doc: http://supervisord.org http://lixcto.blog.51cto.com/4834175/1539136 命令 安装:pip inst ...
- protocol 和delegate(协议和代理)的区别
定义 protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话): delegate:中文叫代理或委托, ...