iOS

问题:KVC的keyPath中的集合运算符如何使用?

2020-05-11  本文已影响0人  姜小舟

KVC集合运算符允许在valueForKeyPath:方法中使用集合运算符执行方法。无论什么时候你在key path中看见了@,它都代表了一个特定的集合方法。集合运算符必须用在集合对象上或普通对象的集合属性上

集合运算符会根据其返回值的不同分为以下三种类型:

一、简单集合操作符

返回的是strings, number, 或者 dates。

NSArray *score = @[@(89),@(80),@(20),@(56),@(89),@(100),@(89),@(89)];
NSLog(@"%@",[score valueForKeyPath:@"@count.self"]);//8
NSLog(@"%@",[score valueForKeyPath:@"@sum.self"]);//612
NSLog(@"%@",[score valueForKeyPath:@"@max.self"]);//100
NSLog(@"%@",[score valueForKeyPath:@"@min.self"]);//20
NSLog(@"%@",[score valueForKeyPath:@"@avg.self"]);//76.5

二、对象操作符

Person *person1 = [[Person alloc] init];
person1.name = @"王五";
person1.age = 10;
person1.position = @"学生";

Person *person2 = [[Person alloc] init];
person2.name = @"赵六";
person2.age = 19;
person2.position = @"学生";

Person *person3 = [[Person alloc] init];
person3.name = @"张三";
person3.age = 30;
person3.position = @"公司高管";

Person *person4 = [[Person alloc] init];
person4.name = @"李四";
person4.age = 25;
person4.position = @"软件开发";

Person *person5 = [[Person alloc] init];
person5.name = @"七七";
person5.age = 19;
person5.position = @"学生";

NSArray *personArr = @[person1,person2,person3,person4,person5];
NSLog(@"%@",[personArr valueForKeyPath:@"@distinctUnionOfObjects.age"]);
#输出结果为:10, 30,  19, 25(去重)
NSLog(@"%@",[personArr valueForKeyPath:@"@unionOfObjects.age"]);
#输出结果为:10, 19, 30,25, 19(没有去重)

三、 数组和集合操作符

数组和集合操作符与对象操作符相似。只不过它是在NSArray和NSSet所组成的集合中工作的。

Student *student1 = [[Student alloc] init];
student1.name = @"张三";
student1.age = 25;

Student *student2 = [[Student alloc] init];
student2.name = @"呵呵";
student2.age = 30;

Student *student3 = [[Student alloc] init];
student3.name = @"李四";
student3.age = 28;
NSArray *studentArr = @[student1,student2,student3];

NSLog(@"%@",[@[studentArr,personArr] valueForKeyPath:@"@distinctUnionOfArrays.age"]);
输出结果:10, 19,28,25,30//两个数组合并去重后
NSLog(@"%@",[@[studentArr,personArr] valueForKeyPath:@"@unionOfArrays.age"]);
#输出结果:25,30, 28, 10,19, 30,25,19//两个数组合并

NSSet *studentSet = [NSSet setWithArray:studentArr];
NSSet *personSet = [NSSet setWithArray:personArr];
NSSet *allSet = [NSSet setWithObjects:studentSet,personSet, nil];
NSLog(@"%@",[allSet valueForKeyPath:@"@distinctUnionOfSets.age"]);
#输出结果:10, 19,28,25,30//和distinctUnionOfArrays效果一样,只不过是NSSet

上一篇 下一篇

猜你喜欢

热点阅读