NSPredicate 是一个Foundation的类,用来定义逻辑条件约束的获取或内存中的过滤搜索,相当于SQL中的
where
用法。
1.集合中使用 NSPredicate
- Foundation提供了
Predicate
来过滤NSArray
、NSMutableArray
、NSSet
、NSMutableSet
、NSDictionary
等集合的方法。 NSArray&NSSet
(不可变集合):通过filteredArrayUsingPredicate
、filteredSetUsingPredicate:
方法评估一个接收到的predicate
来返回一个不可变集合。NSMutableArray&NSMutableSet
(可变集合):通过filterUsingPredicate:
方法评估一个接收到的predicate
来移除评估结果为FALSE的对象,这个可变数组将仅剩下符合要求的对象。同样地,也可以使用filteredArrayUsingPredicate
、filteredSetUsingPredicate:
方法来过滤返回一个符合要求的不可变集合。NSDictionary
:可以使用predicate
来过滤分别过滤键值。
CodeSnippest:
1 | NSMutableArray *mutArr = [NSMutableArray arrayWithObjects:@"bang",@"bing",@"jklb",@"dgjk",nil]; |
2.谓词语法
- 替换
%@
是对值为字符串,数字或者日期的对象的替换值,%K
是key path的替换值
1 | // 第一种写法 |
$VARIABLE_NAME
是可以被NSPredicate-predicateWithSubstitutionVariables:
替换的值。
1 | NSMutableArray *mutArr = [NSMutableArray arrayWithObjects:@"bang",@"bing",@"jklb",@"dgjk",nil]; |
- 基本比较 :=(==)、<、>、<=(=<)、>=(=>)、!=(<>)、BETWEEN
1 | NSArray *arr = @[@2,@3,@4,@5]; |
- 复合谓词 :AND(&&)、OR(||)、NOT(!)
1 | NSArray *arr = @[@"kezhen",@"bole",@"Archae",@"arphan"]; |
- 字符串比较相关:
BEGINSWITH
:以指定字符串开始;CONTAINS
:包含指定字符串;ENDSWITH
:以指定字符串结束;LIKE
:左边表达式等于右边表达式,?
匹配一个字符,*
匹配0个或多个字符;MATCHES:左边的表达式根据ICU v3(更多内容请查看ICU User Guide for Regular Expressions)的regex风格比较,等于右边的表达式。
1 | // LIKE |
- 关系操作:ANY、ALL、NONE、IN
3.创建复合谓词
除了用复合谓词关键字连接组合多个谓词,还可以可用以下方法。
1 | [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"age > 25"], [NSPredicate predicateWithFormat:@"firstName = %@", @"Quentin"]]]; |
4.Block谓词
block可以封装任意的计算,所以有一个查询类是无法以NSPredicate格式字符串形式来表达的(比如对运行时被动态计算的值的评估)。
1 | NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) { |