在平时开发过程中,一个类的成员变量有可能是自定义类或其他的复杂数据类型,可以先用KVC获取该属性,然后再次用KVC来获取这个自定义类的属性,但这样是比较繁琐的,对此,有一个解决方案,那就是键路径keyPath
。
而平时使用valueForKeyPath的常用方法如下:
将元素转为大写
NSArray *spellArr=@[@"spell",@"a",@"b",@"c",@"d",@"e"];
NSLog(@"大写---%@",[spellArr valueForKeyPath:@"uppercaseString"]);
输出结果---
KeyPath[1359:72155] 大写---(
SPELL,
A,
B,
C,
D,
E
)
各类数值计算
NSArray *numberArr=@[@3,@10,@7,@32,@12,@6,@9];
CGFloat sum=[[numberArr valueForKeyPath:@"@sum.floatValue"]floatValue];
CGFloat avg=[[numberArr valueForKeyPath:@"@avg.floatValue"]floatValue];
CGFloat min=[[numberArr valueForKeyPath:@"@min.floatValue"]floatValue];
CGFloat max=[[numberArr valueForKeyPath:@"@max.floatValue"]floatValue];
NSLog(@"总和sum=%.2f-平均值avg=%.2f-最小值min=%.2f-最大值max=%.2f",sum,avg,min,max);
输出结果----
KeyPath[1407:77817] 总和sum=79.00-平均值avg=11.29-最小值min=3.00-最大值max=32.00
筛选相同key的元素
NSArray *array=@[
@{
@"name":@"person",
@"age":@"18"
},
@{
@"name":@"haha"
},
@{
@"name":@"xixi",
@"height":@"180"
}
];
NSLog(@"筛选数组中相同key的元素--%@",[array valueForKeyPath:@"name"]);
输出结果---
KeyPath[1407:77817] 筛选数组中相同key的元素--(
person,
haha,
xixi
)
取多层级中子级属性
NSDictionary *dic=@{
@"first":@{
@"second":@{
@"name":@"text",
@"third":@{@"age":@"18"}
}
}
};
NSLog(@"多个字典层级时,取子层级中的属性--%@",[dic valueForKeyPath:@"first.second.name"]);
输出结果---
KeyPath[1407:77817] 多个字典层级时,取子层级中的属性--text
去除重复元素
NSArray *repeatArr=@[@"haha",@"xixi",@4,@"haha",@4,@"lala"];
NSLog(@"去除数组中重复元素--%@",[repeatArr valueForKeyPath:@"@distinctUnionOfObjects.self"]);
//去重也可用NSSet NSSet不会添加重复元素的特性 排列无序
NSSet *set = [NSSet setWithArray:repeatArr];
NSArray *setArr=[set allObjects];
输出结果---
KeyPath[1407:77817] 去除数组中重复元素--(
xixi,
lala,
haha,
4
)
取存有模型层级中的值
NSMutableDictionary *dictionary=[NSMutableDictionary dictionary];
Model *model=[Model new];
model.title=@"text";
[dictionary setValue:model forKey:@"preface"];
NSString *resultPath=[dictionary valueForKeyPath:@"preface.title"];
NSLog(@"获取存有模型层级中的值--%@",resultPath);
输出结果---
KeyPath[1407:77817] 获取存有模型层级中的值--text
- 另附上一篇KVC详解
网友评论