IOS中谓词的使用

何为“谓词”,即大家所熟悉的NSPredicate。

谓词表达式

说到谓词,少不了谓词表达式,谓词表达式有三个部分组成:表达式、运算符、返回值。谓词表达式必须返回一个BOOL类型的值。
那它能为我们做些什么呢?接下来开始一一道来。

谓词定义

常用的谓词定义方法有两种:

[NSPredicate predicateWithFormat:@""]
[NSPredicate predicateWithBlock:(BOOL (^)(id _Nullable evaluatedObject, NSDictionary<NSString *, id> * _Nullable bindings))block

predicateWithBlock需要在block中写比较逻辑。
例如:

    Model *model0 = [self createModel:@"jane" age:10];
    Model *model1 = [self createModel:@"tim1" age:20];
    Model *model2 = [self createModel:@"tim2" age:21];
    Model *model3 = [self createModel:@"tim3" age:22];
    Model *model4 = [self createModel:@"tim4" age:23];
    Model *model5 = [self createModel:@"Tim6" age:11];
    NSArray *array = @[model0,model1,model2,model3,model4,model5];
    NSLog(@"filter0:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.age BETWEEN {10,15} AND SELF.name BEGINSWITH[cd] %@",@"tim"]]);
    NSLog(@"filter00:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.age BETWEEN {10,15} AND SELF.name LIKE[cd] %@",@"tim*"]]);
    NSLog(@"filter1:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.age BETWEEN {10,15} AND SELF.name CONTAINS[cd] %@",@"tim"]]);
    NSLog(@"filter11:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.age BETWEEN {10,15} AND SELF.name CONTAINS[cd] %@",@"tim"]]);
    NSLog(@"filte2r:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF.age >= 10 AND SELF.age <= 15"]]);
    NSLog(@"filter3:%@",[array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Model *evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
        if (evaluatedObject.age >= 10 && evaluatedObject.age <= 15) {
            return YES;
        }
        return NO;
    }]]);
/*
filter0:(
    "<Model: 0x6000037f2780>"
)
filter00:(
    "<Model: 0x6000037f2780>"
)
filter1:(
    "<Model: 0x6000037f2780>"
)
 filter11:(
    "<Model: 0x6000037f2780>"
)
filte2r:(
    "<Model: 0x6000037f2720>",
    "<Model: 0x6000037f2780>"
) 
filter3:(
    "<Model: 0x6000037f2720>",
    "<Model: 0x6000037f2780>"
)
*/

谓词占位符

%K,%@
其中%K可以表示需要匹配的property,比如 name LIKE 'tim',
用占位符表示为%K LIKE %@,@"name",@"tim
"

比较运算

关键字

  • =、==
    表示两个表达式或值是否相等,比如:
NSPredicate *predicate11 = [NSPredicate predicateWithFormat:@"SELF = 'abc'"];
NSPredicate *predicate12 = [NSPredicate predicateWithFormat:@"SELF ==[cd] 'abc'"];
NSLog(@"结果11:%d",[predicate11 evaluateWithObject:str]);
NSLog(@"结果12:%d",[predicate12 evaluateWithObject:str]);
//结果11:0
//结果12:1
  • >,<,>=,<=,!=
    大小比较
  • BETWEEN
    表示在范围区间之间,比如:SELF BETWEEN {100,200} 等价于 SELF >= 100 && SELF <= 200.

逻辑运算

  • AND,&&
    逻辑与
  • OR,||
    逻辑或
  • NOT,!
    逻辑非

字符串匹配

关键字:

  • BEGINSWITH
    以某个字符开头,比如:判断是否以w字符开头,BEGINSWITH 'w'
  • ENDSWITH
    以某个字符结尾,比如:判断是否以w字符结尾,ENDSWITH 'w'
  • CONTAINS
    表示字符串中是否包含某特定字符串,比如:CONTAINS 'abc'
  • LIKE
    检测字符串是否匹配某字符串模板,比如:name LIKE '?a'。表示name是否为第二个字母为'a'
  • MATCHES
    用于匹配正则表达式,比如匹配手机号等:SELF MATCHES '^[1][3-8]\d{9}$'
    其中可以用[c]紧接在关键字后表示忽略大小写匹配,[d]表示忽略重低音匹配,[cd]可以一起连用。比如:
NSString *str = @"aBc";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] 'b'"];
NSLog(@"结果:%d",[predicate evaluateWithObject:str]);
//结果:1

集合运算

关键字

  • ANY,SOME
    集合中任意一个元素满足条件,就返回YES。
  • ALL
    集合中所有元素满足条件,就返回YES。
  • NONE
    集合中所有元素都满足条件,就返回YES。
  • IN
    继承中IN左右的元素出现在表示式右边时才返回TRUE.
NSArray *arr1 = @[@1,@2,@3,@4,@5];
NSArray *arr2 = @[@1,@3,@5];
NSLog(@"filter1:%@",[arr1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@",arr2]]);
NSLog(@"filter2:%@",[arr1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NOT SELF IN %@",arr2]]);
/*
  filter1:(
    1,
    3,
    5
)
filter2:(
    2,
    4
)
*/

以上就是简单的介绍,谨以此加深印象。

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

推荐阅读更多精彩内容

  • 首先,我们需要知道何谓谓词,让我们看看官方的解释: The NSPredicate class is used t...
    jeckHao阅读 1,136评论 1 5
  • 首先,我们需要知道何谓谓词,让我们看看官方的解释:The NSPredicate class is used to...
    旭日飞扬阅读 1,511评论 0 0
  • 谓词 Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,...
    coder_hong阅读 839评论 0 1
  • 今天一整天天阴沉沉的,下午飘起了纷纷扬扬的大瓣雪花,不过,天气还不够冷,所以,落地即化,留不住雪。 ...
    笑抵千言阅读 200评论 2 2
  • 2018.8.6 星期一 晴 从昨天开始刷爆朋友圈的,北京双胞胎女孩来黄岛游玩时在海滩走失的消息,...
    团团圆圆妈妈阅读 260评论 1 1