NSPredicate用于定义一个逻辑条件,通过该条件可执行搜索或内存中的过滤操作。
一.谓词的定义
谓词是由NSPredicate
对象来代表,在实际编程中会直接使用NSPredicate
的predicateWithFormat:
方法,以一个谓词字符串为参数来创建NSPredicate
对象。
//无占位符
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like 's*' "];
创建谓词之后—>
1.如果谓词中没有占位符参数,即可用NSPredicate的evaluateWithObject:
方法计算谓词的结果,该结果总是一个BOOL值。
2.如果谓词中有占位符参数,则需要经过两步来计算谓词的结果:
- 调用谓词的
predicateWithSubstitutionVariables:
方法为占位符参数设置参数值。 - 执行谓词的
evaluateWithObject:
方法计算谓词的返回结果
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
User *user = [[User alloc] initWithName:@"Hello,World" Age:100];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like 'Hello,*' "];//创建一个谓词
BOOL result = [pre evaluateWithObject:user];//根据指定对象user来计算谓词的值
NSLog(@"result = %d",result);
}
return 0;
}
二.使用谓词过滤集合
谓词的一个常用功能是对集合进行过滤。
NSArray
:
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;
使用指定的谓词过滤NSArray集合,返回该集合中符合谓词条件的元素组成的元素。
NSMutableArray
:
- (void)filterUsingPredicate:(NSPredicate *)predicate;
使用指定的谓词过滤NSMutableArray集合,剔除该集合中不符合条件的元素。
NSSet
:
- (NSSet *)filteredSetUsingPredicate:(NSPredicate *)predicate;
NSMutableSet
:
- (void)filterUsingPredicate:(NSPredicate *)predicate;
示例代码:
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//过滤NSMutableArray
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:20],[NSNumber numberWithInt:50],[NSNumber numberWithInt:80], nil];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF >50"];
[array filterUsingPredicate:pre];
NSLog(@"value > 50 %@",array);
//过滤NSSet
NSSet *set = [NSSet setWithObjects:[[User alloc] initWithName:@"Swift" Age:3],[[User alloc] initWithName:@"Objective-C" Age:20],[[User alloc] initWithName:@"C++" Age:30], nil];
NSPredicate *pred = [NSPredicate predicateWithFormat:@" name CONTAINS 'C'"];
NSSet *newSet = [set filteredSetUsingPredicate:pred];
NSLog(@"%@",newSet);
}
return 0;
}
三.在谓词中使用占位符
如果需要在谓词表达式中使用变量,则可以考虑在谓词表达式中使用占位符参数,谓词表达式支持如下两个占位符参数:
%K
:该占位符用于动态传入属性名%@
:该占位符用于动态设置属性值
除此之外,还可以在谓词表达式中使用动态改变的属性值,类似于环境变量,使用$str
形式表示。
[NSPredicate predicateWithFormate:@"name CONTAINS $SUBSTR"];
- 首先调用NSPredicate的
predicateWithSubstitutionVariables:
方法为占位符参数设置参数值,该方法返回一个可用的NSPredicate对象。 - 直接调用NSPredicate的
evaluateWithObject:substitutionVariables:
方法同时完成参数设置和计算结果。
示例代码:
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSSet *set = [NSSet setWithObjects:[[User alloc] initWithName:@"阿里巴巴" Age:21],[[User alloc] initWithName:@"腾讯" Age:22],[[User alloc] initWithName:@"百度" Age:23],[[User alloc] initWithName:@"阿里云" Age:24], nil];
NSString *path = @"name";
NSString *value = @"阿里";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K CONTAINS %@",path,value];
NSSet *newSet = [set filteredSetUsingPredicate:pre];
NSLog(@"newSet = %@",newSet);
NSPredicate *temp = [NSPredicate predicateWithFormat:@"%K CONTAINS $SUBSTR",@"name"];
NSPredicate *pre1 = [temp predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:@"度",@"SUBSTR", nil]];
NSSet *newSet1 = [set filteredSetUsingPredicate:pre1];
NSLog(@"newSet1 = %@",newSet1);
NSPredicate *pre2 = [temp predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:@"讯",@"SUBSTR", nil]];
NSSet *newSet2 = [set filteredSetUsingPredicate:pre2];
NSLog(@"newSet2 = %@",newSet2);
}
return 0;
}
四.谓词表达式语法
1.基本的比较运算符
=、==
:>=、=>
:<=、=<
:>
<
!=、<>
BETWEEN
:这个表达式必须满足”表达式 BETWEEN {下限,上限}
“,要求表达式的值大于等于下限,小于等于上限
2.基本的逻辑运算符
AND、&&
OR、||
NOT、!
3.字符串比较运算符
BEGINSWITH
ENDSWITH
CONTAINS
LIKE
MATCHES
:检查某个字符串是否匹配指定的正则表达式,MATCHES后面可使用正则表达式。
4.操作集合的运算符
ANY、SOME
ALL
NONE
IN
:只有左边表达式或值出现在右边的集合中才会返回YES。,例如,name IN {'Ricky','David'}
5.直接量
SELF
:代表正在被判断的对象本身。