参考网站:http://www.jianshu.com/p/88be28860cde
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。
即NSPredicate相当于一个过滤器,被判断对象是否符合判断逻辑或者从集合中筛选出符合判断条件的成员。最强大的功能是从从集合中筛选出符合判断条件的成员。适用集合包括NSArray、NSMutableArray、NSSet、NSMutableSet。
谓词 支持 正则表达式。
使用谓词NSPredicate都需要定义谓词表达式,而这个谓词表达式必须是一个返回BOOL型的值。
谓词表达式必须使用英文输入法,比如LIKE运算符中的 ? 通配符如果使用的是中文会报错。除了必须在中文输入法下才能输入的字符,比如、等。
谓词表达式可由 表达式 、运算符 和 值 构成。
运算符包括 比较运算符(=、>=等) , 逻辑运算符(&&、||等) , 字符串比较运算符(BEGINSWITH、LIKE等) ,集合运算符(ANY、IN等)
运算符
1、比较运算符
=、==:判断两个表达式是否相等。在谓词中=和==等价,都是判断,=号没有赋值一说。
输出为true
此处省略了筛选数组(是可以筛选数组的)
创建NSPredicate使用的是NSPredicate(format: String, args: CVarArg…)方法创建。
SELF代表正在被判断的对象自身
其他比较运算符:
=、=>:左边表达式的值是否 大于或等于 右边表达式的值(亲测=>可使用)
<=、=<:左边表达式的值是否 小于或等于 右边表达式的值(亲测=<可使用)
:左边表达式的值是否 大于 右边表达式的值
< :左边表达式的值是否 小于 右边表达式的值
!=、<> :左右表达式的值是否不相等。<>是大于或小于
BETWEEN:BETWEEN表达式必须满足 表达式 BETWEEN {下限,上限} 的格式,如果表达式大于或等于下限,小于或等于上限时才会返回true。
输出为true。单词之间或单词和表达式之间可以插入空格。
2、逻辑运算符
AND、&&:逻辑与,要求表达式都为真时才返回true。
输出为true
输出为[1,2,3,4]。
注意:NSPredicate也可用来筛选数组中符合谓词表达式的成员(是否成员的内存地址相同???)
其他逻辑运算符:
OR、||:逻辑或,要求只要其中一个表达式为真时,返回结果就为true,否则返回false
NOT、!:逻辑非,对原来表达式取反
3.字符串比较运算符
CONTAINS:检查字符串是否包含指定的字符串。
输出为true
输出为[aljfljlgsdf, sdfea, sdf]
其他字符串比较运算符
BEGINSWITH:检查字符串是否以指定字符串开头
ENDSWITH :检查字符串是否以指定字符串结尾
LIKE : 检查字符串是否包含指定的字符串模板。字符串模板可以包含 ? 和 * 两个通配符。?代表一个字符,* 代表任意多个字符。比如 SELF LIKE ‘ac’ , 表示字符串中包含ac则返回true。SELF LIKE ‘?ac’ ,表示第2,3个字符为ac时返回true。
输出为false
MATCHES :检查字符串是否匹配指定的正则表达式。
输出为true。此处用数组进行筛选的话可筛选出符合正则表达式的成员。上面其实也是一个验证手机号码是否有效。
注意:(谓词的缺陷)
在使用谓词过程中,在使用正则表达式时,正则表达式要包含被匹配的字符串才可能返回true。比如正则表达式为“123abc”,被匹配字符串为“123abc”,匹配结果是true。但如果被匹配字符串为“123abcd”,匹配结果则为false。(在线正则表达式测试网站中如果被匹配字符串为“123abcd”的话是可以匹配到正则表达式为“123abc”的,这也是正确的匹配结果。暂不清楚谓词这个问题的原因)。当然,如果正则表达式为“123abcdef”,匹配字符串为“123abc”,匹配结果必然是false(正常结果,不使用谓词也是如此的)
4.集合运算符(操作集合)
ANY、SOME:集合中任意一个元素满足条件,就返回true
输出为true。可操作数组。
其他集合运算符
ALL :集合中所有元素都满足条件时才返回true。
NONE :集合中所有元素都不满足条件时才返回true。
IN :只有当左边表达式或值出现在右边的集合中才会返回true.(自动遍历数组)
输出[efa]。不加 NOT 输出是 [ab,abcd]。没有NOT时代码意思是把array1中的在array2中也存在的元素筛选出来。有NOT时代码的意思是把把array1中的在array2中也存在的元素去除。
直接量
在谓词表达式中可以使用如下直接量(未查明如何使用)
FALSE、NO:代表逻辑假 TRUE、YES:代表逻辑真
NULL、NIL:代表空值 SELF:代表正在被判断的对象自身
双引号“”和单引号’':代表字符串
数组:和c中的写法相同,如{'one’,’two’,’three’}
数值:包括证书、小数和科学计数法表示的形式。
十六进制数:0x开头的数字
八进制:0o开头的数字
二进制:0b开头的数字
保留字
AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE。
FIRST、LAST、SIZE用于数组,使用方式未查明。
虽然大小写都可以,但推荐使用大写来表示这些保留字
注意:而谓词最常用的功能就是对集合进行过滤。当程序使用谓词对集合元素进行过滤时,程序会自动遍历其元素,并根据集合元素来计算谓词表达式的值,当这个集合中的元素计算谓词表达式值并返回YES时,这个元素才会被保留下来。请注意程序会自动遍历其元素,它会将自动遍历过之后返回为YES的值重新组合成一个集合返回。
谓词在集合中的使用规则
适用集合包括NSArray、NSMutableArray、NSSet、NSMutableSet。
NSArray中使用谓词(model2是NSArray类型)
NSMutableArray中使用谓词(model3是NSMutableArray类型)
NSSet和NSMutableSet也是同理。
由上面可知,使用谓词过滤不可变集合和可变集合的区别是:
过滤不可变集合时,会返回符合条件的集合元素组成的新集合。(filtered函数)
过滤可变集合时,没有返回值,会直接剔除不符合条件的集合元素。(filter函数)
当然,可变集合也可使用filtered函数来组成新的集合。
输出如下:
NSPredicate的另一种使用(根据类的属性值来筛选类)
谓词表达式也可根据某个类的成员变量的值来进行筛选
首先定义一个类
然后在别的类里进行筛选
输出 true
集合成员是类
输出是[<NSPredicate.MMdoel: 0x600000043390>, <NSPredicate.MMdoel: 0x6000000433c0>]
如果需要多个成员变量判断,可这样写"name LIKE 'bs*' && age > 11”,前提是要有name,age属性
注意:谓词表达式中属性名必须和类中的成员变量名完全一致(区分大小写),不一样会报错。
在谓词中使用占位符参数(动态修改谓词表达式)
在上面所有例子中谓词表达式都是固定的,但在开发中经常需要谓词表达式是可变的,所以需要使用占位符来代替固定的表达式或值。
需要使用到三个占位符
%K :用于动态传入属性名。如”name LIKE ‘bs’ ” 中的name
%@ :用于动态设置属性值。如”name LIKE ‘bs’ ” 中的‘bs*’
$VALUE :和%@作用类似,但$VALUE能用于其他类型,比如INT,而且$VALUE用法也和%@不同。$VALUE是一个可以动态变化的值,它其实最后是在字典中的一个key,所以可以根据你的需要写不同的值,但是必须有$开头。
范例:
首先定义一个类
使用如下
输出