iOS开发使用谓词过滤两个存储复杂对象的数组

我是前言

NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。

谓词的基本用法我相信大家也都知道,网上也有很多的帖子分享了关于谓词的使用,下面是关于过滤存储复杂对象数组的谓词用法。

使用谓词过滤两个存储复杂对象数组的方法

直接上代码

首先定义一个person 类 (可能命名有一些不规范…还请不要在意这些细节)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <Foundation/Foundation.h>



@interface person : NSObject



@property (nonatomic,strong) NSString *num;

@property (nonatomic,strong) NSString *name;



+ (instancetype)personWithNum:(NSString *)num name:(NSString *)name;

@end

在视图控制器(例子中是放在VC中的)中初始化一些person对象 ,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
person *a1 = [person personWithNum:@"1" name:@"我0"];

person *a2 = [person personWithNum:@"2" name:@"我1"];

person *a3 = [person personWithNum:@"3" name:@"我2"];

person *a4 = [person personWithNum:@"1" name:@"我0"];

person *a5 = [person personWithNum:@"5" name:@"我4"];

person *a6 = [person personWithNum:@"6" name:@"我5"];

person *a7 = [person personWithNum:@"7" name:@"我6"];

person *a8 = [person personWithNum:@"8" name:@"我7"];



NSArray *array1 = [NSArray arrayWithObjects:a1,a2,a3,a8, nil];

NSArray *array2 = [NSArray arrayWithObjects:a3,a4,a5,a6,a7,a1, nil];

接下来就是重点了 , 不啰嗦,直接上代码 。

1
2
3
4
5
6
7
8
9
10
11
//使用第一个数组  来过滤 第二个数组   SELF.num IN %@.num 判断两个数组中  如果有   对象  num 相同的 就  保存到  result 数组中。

// NOT ( SELF.num IN %@.num) //就是 对上面的结果 取反

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.num IN %@.num",array1];



NSArray *result = [array2 filteredArrayUsingPredicate:predicate];

NSLog(@"%@",result);

当然结果就是 array1 和 array2 中 num相同的对象 会存储在 result数组中
这里只是一个小小的demo,一个思路,希望能对有需要的人提供帮助.

谓词语法

替换

1.%@是对值为字符串,数字或者日期的对象的替换值。
2.%K是key path的替换值。

1
2
3
4
5

NSPredicate *ageIs33Predicate = [NSPredicate predicateWithFormat:@"%K = %@", @"age", @33];

// ["Charlie Smith"]
NSLog(@"Age 33: %@", [people filteredArrayUsingPredicate:ageIs33Predicate]);

基本比较

1.=, ==:左边的表达式和右边的表达式相等。
2.>=, =>:左边的表达式大于或者等于右边的表达式。
3.<=, =<:左边的表达式小于等于右边的表达式
4.>:左边的表达式大于右边的表达式。
5.<:左边的表达式小于右边的表达式。
6.!=, <>:左边的表达式不等于右边的表达式。
7.BETWEEN:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数列(指定顺序的数列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。

基本复合谓词

1.AND, &&:逻辑与.
2.OR, ||:逻辑或.
3.NOT, !:逻辑非.

字符串比较

字符串比较在默认的情况下是区分大小写和音调的。你可以在方括号中用关键字符c和d来修改操作符以相应的指定不区分大小写和变音符号,比如firstname BEGINSWITH[cd] $FIRST_NAME。
1.BEGINSWITH:左边的表达式以右边的表达式作为开始。
2.CONTAINS:左边的表达式包含右边的表达式。
3.ENDSWITH:左边的表达式以右边的表达式作为结束。
4.LIKE:左边的表达式等于右边的表达式:?和可作为通配符,其中?匹配1个字符,匹配0个或者多个字符。
5.MATCHES:左边的表达式根据ICU v3(更多内容请查看ICU User Guide for Regular Expressions)的regex风格比较,等于右边的表达式。

合计操作

关系操作

1.ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
2.ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
3.NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY …)。
4.IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { ‘Ben’, ‘Melissa’, ‘Nick’ }。

数组操作

1.array[index]:指定数组中特定索引处的元素。
2.array[FIRST]:指定数组中的第一个元素。
3.array[LAST]:指定数组中的最后一个元素。
4.array[SIZE]:指定数组的大小

这是结束语 (壮士,来一碗鸡汤吧)

越是黑暗时,越不能熄灭生命的灯盏,越要点亮人生的光芒。