NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。
NSPredicate使用时主要分两步走:第一步,定义谓词语句;第二步,根据要求,选择不同的方法执行谓词语句。
一.定义谓词语句
首先,我们来定义一个谓词语句,在定义谓词语句时,先介绍谓词的语法。
1.比较运算符(用于数值和字符串)
>:大于
<:小于
>=:大于等于
<=:小于等于
=,==:等于
!=,<>:不等于
between:左边的表达式等于右边的表达式的值或者介于它们之间。右边是一个有两个指定上限和下限的数值的数列(指定顺序的数列)。比如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。
2.逻辑运算符
and/&&:与
or/||:或
not/!:非
3.关系运算符
ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。
4.字符串本身:SELF
例:@"SELF == 'APPLE'"
5.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。
6.通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
7.正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
二.执行谓词语句
方法1:- (void)filterUsingPredicate:(NSPredicate *)predicate;针对可变数组进行过滤,过滤掉可变数组中不符合条件的。
例:
//定义谓词语句
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];
//过滤可变数组
[_mutableArray filterUsingPredicate:predicate];
方法2:- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; 针对不可变数组进行过滤,将符合条件的元素组成一个新数组进行返回
例:
//定义谓词语句
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age > 3"];
// 不可变数组过滤将过滤后符合条件的元素组成一个新数组返回
NSArray *array = [[NSArray alloc]initWithArray:_mutableArray];
array = [array filteredArrayUsingPredicate:predicate];
方法3:- (BOOL)evaluateWithObject:(id)object; 向谓词对象发送该方法,参数是过滤的对象。常见于和正则表达式配合使用。
例:
NSString *number = @"^[0-9]$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",number];
//符合过滤条件就返回yes
BOOL isTrue = [predicate evaluateWithObject:textString];
三.其他使用场景
NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@5,@5,@6,@7, nil];
NSArray *array2 = [NSArray arrayWithObjects:@4,@5, nil];
// 表示筛选array1在array2中的元素! 其中SELF指向filteredArrayUsingPredicate的调用者。
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF in %@",array2];
NSArray *temp1 = [array1 filteredArrayUsingPredicate:predicate1];
结果: