美文网首页
KVC中级知识

KVC中级知识

作者: DarkString | 来源:发表于2018-04-01 17:03 被阅读0次

常用方法

上一篇文章讲了KVC最基本的知识,只涉及了下面2个方法:

- (nullable id)valueForKey:(NSString*)key;               //取属性值
- (void)setValue:(nullableid)value forKey:(NSString*)key;//设置属性值

下面有2个与其类似的方法:

- (nullable id)valueForKeyPath:(NSString*)keyPath;               //取属性值
- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;//设置属性值

这两个方法会根据keyPath中用“.”分隔的key按顺序定位到属性,如下:

@interface Cat: NSObject
@property (nonatomic, copy  ) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end

@interface Person: NSObject
@property (nonatomic, strong) Cat *pet;
@end

Person *person = [[Person alloc] init];
//设置person.pet的name值
[person setValue:@"Tom" forKeyPath:@"pet.name"]; 
//取person.pet的age值
NSNumber *age = [person valueForKeyPath:@"pet.age"];

上面的方法都只能操作单一属性,下面2个方法能同时作用于多个属性:

- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;

顾名思义,这2个方法就是根据给的key集合以字典形式返回对应的值和根据跟定的字典设置属性值。

集合运算

在使用valueForKeyPath且属性为集合类时,可以在keyPath中嵌入集合运算。集合运算是由符号“@”和跟在后面的一些特定关键字组成,通常都是操作在keyPath中跟在其后面的属性。运算可分为三类,以下面的数据为例:

@interface Person: NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSDate *birthday;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSArray<Person *> *contacts;
@end

假设Jerry的contacts中有3个联系人,如下表格

name birthday age
John 1985-04-06 33
Tom 1992-01-25 26
John 2001-03-07 17
  • 聚合运算
    @avg:取集合中所有元素,返回它们的算数平均值
    @sum:取集合中所有元素,返回它们相加的值
    @max:取集合中所有元素,返回它们的最大值
    @min:取集合中所有元素,返回它们的最下值
    @count:返回集合中元素的数量,keyPath中其后不需要跟属性
NSNumber *ageAvg = [Jerry valueForKeyPath:@"contacts.@avg.age"]; //25.33
NSNumber *ageSum = [Jerry valueForKeyPath:@"contacts.@sum.age"]; //76.00
NSNumber *ageMax = [Jerry valueForKeyPath:@"contacts.@max.age"]; //33
NSNumber *birthdayMin = [Jerry valueForKeyPath:@"contacts.@min.birthday"]; //1985-04-06 
NSNumber *count = [Jerry valueForKeyPath:@"contacts.@count"]; //3

@max和@min会调用集合中元素的compare:方法,对于自定义类,你可以自己实现compare:方法。

  • 数组运算
    @distinctUnionOfObjects:取集合中所有元素,返回去重后的数组
    @unionOfObjects:取集合中所有元素,返回未去重的数组
NSArray *distinctContacts = [Jerry valueForKeyPath:@"contacts.@distinctUnionOfObjects.name"];
NSArray *contacts = [Jerry valueForKeyPath:@"contacts.@unionOfObjects.name"];

distinctContacts的结果是{John, Tom},去掉了一个重复的John。
contacts的结果是{John, Tom, John},未去重。

  • 嵌套运算
    该运算针对的是集合中的元素也是集合的情况
    @distinctUnionOfArrays:取集合中所有集合的所有元素,返回去重后的数组
    @unionOfArrays:取集合中所有集合的所有元素,返回未重的数组
    @distinctUnionOfSets:取集合中所有集合的所有元素,返回去重后的集合,和distinctUnionOfArrays不同的是返回的是NSSet而非NSArray。
NSArray *array = @[Jerry, Jerry];
NSArray *distinctContacts = [array valueForKeyPath:@"contacts.@distinctUnionOfArrays.name"];
NSArray *contacts = [Jerry valueForKeyPath:@"contacts.@unionOfArrays.name"];

distinctContacts的结果是{John, Tom},去掉了3个重复的John和1个重复Tom。
contacts的结果是{John, Tom, John,John, Tom, John},未去重。

相关文章

  • KVC中级知识

    常用方法 上一篇文章讲了KVC最基本的知识,只涉及了下面2个方法: 下面有2个与其类似的方法: 这两个方法会根据k...

  • KVC进阶知识

    KVC是如何通过key来存取属性的?这里是有一套规则的: valueForKey:的查找规则 查找是否存在比较直接...

  • KVC底层原理--YYModel简述

    YYModel的作用就是字典转模型,在了解YYModel前,我们先了解下KVC的知识。 KVC:也称之键值编码,是...

  • KVC详解

    KVC 目录结构KVC定义KVC取值和设置KVC使用keyPathKVC处理字典KVC作用 参考:iOS KVC和...

  • KVC知识点

    1、KVC简介 KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性...

  • kvc相关的知识

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...

  • KVC基本知识

    什么是KVC KVC全称Key-value coding,是一种对象用于间接访问其属性的机制。使用时通过属性名称的...

  • KVC知识点

    KVC称为键值编码(key-value coding),从一个字符串名派生出一个访问器的名称。键(key)是一个字...

  • KVC相关知识(笔记)

    kvc可以通过key来访问对象的某个属性,它常见的方法有: key和keyPath的区别是:如果想要访问的是对象内...

  • iOS原理篇(二): KVC实现原理

    KVC实现原理 什么是 KVC KVC基本使用 KVC 原理 总结 一 、 什么是KVC KVC的全称是Key-V...

网友评论

      本文标题:KVC中级知识

      本文链接:https://www.haomeiwen.com/subject/hhnocftx.html