标签:没有 符号 简化 技术 疑惑 优点 代码 jpg 实现
KVC:Key Value Coding,取其三个单词首字母浓缩而成。直白翻译过来就是键值编码,什么意思呢?简单来说,就是操作一个对象,也可以像操作字典一样,通过key来取值和赋值。
我们先创建一个HMPerson类来试验一下。
然后实例化HMPerson类的对象,此时,我们如果想要给它的name和age两个属性赋值和取值,就可以用点语法来操作,如图:
但是,这种点语法方式显得着实太low,接下来我们就用比较高大上的方式——KVC的方式来赋值和取值。
我们先简单看看KVC里的几个方法:
赋值:
- (void)setValue:(nullable id)value forKey:(NSString *)key; - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
解释:这种方式比较暴力,后头会解释
-(void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id>*)keyedValues;
取值:
- (nullableid)valueForKey:(NSString *)key; - (nullable id)valueForKeyPath:(NSString *)keyPath;
KVC
**的优点合集
优点一:破门而入:与别人家的“私人专属”亲密接触**
我们都知道,如果@property写在.h文件中,代表外界可以通过调用对应的setter和getter方法(或点语法)来访问对应的私有成员变量,但如果写在.m中,代表只允许本类中访问,其他地方访问不了。因此,我们给之前的Person类在.m文件中写一个延展,把.h文件的@property挪到.m的延展中。并且在.m文件中再加一个用@private修饰的成员变量
如图:
对,仅需调用setValuesForKeysWithDictionary方法,传入字典即可。这个方法内部,帮我们做了我们刚刚循环字典的操作,因此仅仅这一个方法就可完成字典数据转模型数据,从此,妈妈再也不用担心我写多余代码了!
KVC
**疑问解密
疑问解密
1:
**
使用KVC是直接对成员变量赋值,还是调用了这个成员变量对应的setter和getter方法呢?
为了解决这个疑问,我们给HMPerson类里加一个私有的成员变量name,并且给它写好对应的getter和setter方法,如图:
通过观察,我们发现用KVC来赋值时,对应的setter方法能被调用,用KVC来取值时,对应的getter方法也能被调用。
因此小伙伴们不用担心KVC会破坏自己已经写好的属性封装规则。
疑问解密1小分支:
如果没有getter方法和setter方法时,KVC是怎么找成员变量的呢?
为了弄清这个问题,我们删掉name的getter和setter方法。然后通过KVC方式赋值取值,会发现,依然可以赋值和取值成功。并且是给p对象的成员变量_name赋值的。如图:
此时发现,用KVC赋值的就是这个不带下划线的成员变量(即name)了。
因此,我们可以总结出,KVC赋值和取值的一套顺序:
**
setValue:属性值 forKeyPath:属性路径 valueForKeyPath:属性名
复制代码
后面带Path的跟之前我们用的KVC有什么不同呢?我们来研究研究!
假设此时有一个Dog类,而Person类里也有个属性是Dog类型的,叫pet,如图
因此,也就是说,如果需要操作访问一些“属性里的属性”时,就用带Path的方法来操作。
** 疑问解密
3:
**
如果用
KVC赋值时,某一个
Key,类中没有会怎样?
例如:我们的
HMPerson类现在没有
salary属性。
此时,无论你输错多少次HMPerson对象不存在的属性时,都不会在运行时让程序崩溃,达到报错“友好”的目的。
**总结
**
KVC是一套方便我们用字符串来操作对象的机制,可以使得操作对象时跟操作字典一样的灵活。在字典转模型的领域中应用起来极为方便,并且
KVC可以轻松的帮我们突破访问限制的一些问题,直接访问到私有成员。
标签:没有 符号 简化 技术 疑惑 优点 代码 jpg 实现
原文地址:http://www.cnblogs.com/WJJ-Dream/p/6773826.html