NSPredicate-谓词

参考网站: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,所以可以根据你的需要写不同的值,但是必须有$开头。
范例:
首先定义一个类


使用如下

输出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 开发中经常需要从集合中查找到某个或某些值,或者通过过滤得到想要的内容,这都是家常便饭的事儿。所以,我们常见的就是需...
    秋月夜阅读 3,926评论 1 9
  • 前言 NSPredicate 谓词, 其实 NSPredicate 有时候完全可以被 [for...][if..e...
    Mr_Lucifer阅读 2,024评论 0 18
  • 世事洞明皆学问,人情练达即文章。 在自己擅长的领域, 每个人都有超乎寻常的自尊心和自信心,但不要自负。不同的...
    和珏猫阅读 770评论 3 4
  • 一心一人一世界 一情一物一春秋 了去无从
    微微一笑那五年阅读 163评论 0 0
  • 想着早点交作业,抢占下期名额,昨天我花了两个多小时,凭着灵感也是我的真情实感写了篇近1800字的作文,开心提交,愉...
    范秀云阅读 197评论 2 1