在开发中,咱们常常会遇到一些须要,让咱们从集合中查找某个值,从集合中过滤想要的内容等等,于是咱们就须要遍历
集合,加条件判断,而后获取符合条件的值。而关于集合的遍历
是全部软件开发从业人员常常打交道的一些事情。正则表达式
把范围缩小到iOS开发中,关于集合地遍历的方法就有好多种,人们一直在讨论和争辩,想寻找出一种最快最有效的方法,是用for循环
,仍是block
,是用并发操做
,仍是顺序操做
,等等。甚至有人不惜使用大数据量
来测试各类遍历方式的效率
以及精确度
。并发
然而我认为寻找并选择一种本身认为合适的操做是最好的,简单地几个数据的集合,就用到普通的for循环,基于大数据量的遍历就须要用到并发操做。框架
NSPredicate
而我并不会在这里展现如何遍历集合,而是提示一种在iOS开发中,用一种相似于SQL语句来过滤集合内容的方式从而避免了本身进行集合遍历的方法,就是NSPredicate
。苹果在Cocoa touch框架给咱们提供了NSPredicate
这个类,封装了一些让咱们能够直接对集合设置过滤条件的方法,而至于苹果是如何在SDK中进行数据查找地,咱们并不须要关心,由于我相信它作的必定比咱们好。学过SQL语法
的人,使用NSPredicate
会十分容易。我会在下面的内容中详细的讲述NSPredicate
的语法规则。测试
如<, >, == , !=, 等等这些数学符号表达式,在NSPredicate的format中依然有效大数据
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF > 10"];
"SELF"表明的时集合中的对象自己,此时集合对象是整型数据,在iOS中的集合能够是nil以外的任何数据类型。code
如IN
,BETWEEN
等等这种表明范围区间的格式字符串,能够形象地称之为关键字orm
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"age BETWEEN {1,5}"];
"age"表明了集合中对象的一个实例属性,此时集合中的对象是一个个的实体。对象
如BEGINSWITH
,ENDSWITH
,CONTAINS
,顾名思义,咱们能够很容易理解他们的过滤条件开发
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",text];
在格式化语言中,咱们仍然能够自如地使用”%@“等符号表示变量。[cd]中的c表示不区分大小写,d表示不区分发音符号。字符串
如LIKE
,这些与SQL语义中的关键字定义十分相像。
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'"];
在NSPredicate格式串中,是自动给字符串加上引号的,因此咱们自定义的字符串必须加上引号(单/双)
如MATCHES
,诸如其余的查找语言,都是须要匹配正则表达式的
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name MATCHES 'Z.+e$'"];
如AND
,在设置过滤条件时,可能单一条件并不能知足咱们的须要,因此咱们就须要设置组合条件
NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] '*er'" AND age > 10];