「OC」NSPredicate —— 使用谓词过滤元素

「OC」NSPredicate —— 使用谓词过滤元素

前言

在暑假的3Gshared和学生管理系统之中,无论是登陆注册界面还是学生信息的输入,都存在需要我们对输入内容进行限制,于是我们就需要找到一个方法来解决对输入内容的判断限制,就是NSPredicate——谓词来过滤输入的元素。由于在暑假的几个任务之中只是知道如何使用,并没有仔细了解,乘着暑假剩下的空闲时间进行学习总结。

介绍

NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配。使用NSPredicate可以有效地过滤和查询数据,提高数据处理的效率和灵活性。在Core Data中,NSPredicate常用于构建Fetch请求,从数据库中检索符合特定条件的数据。同时,在使用集合类(如NSArray、NSDictionary)时,NSPredicate也可以用来对数据进行过滤和排序。

首先我们需要了解构建谓词的常用运算符

请添加图片描述

此处为运算符的总结,看起来有点无从下手是吧,别急,后文在用到的时候还会再将功能贴出

了解完运算符,我们就可以了解如何使用NSPredicate,谓词表达式由表达式、运算符和值构成。

  1. predicateWithFormat:创建一个谓词。
+ (id)predicateWithFormat:(NSString *)format...;
  1. evaluateWithObject:接受对象,根据指定的对象计算自身的值。
-(BOOL)evaluateWithObject:(id)value;

谓词的一个常用功能就是对集合进行过滤,当程序使用谓词对集合进行过滤时,程序将会自动遍历集合元素,并根据集合元素来计算谓词的值,只有当根据某个集合元素计算谓词并返回YES时,该集合元素才会被保留下来。

//使用指定的谓词过滤NSArray集合,返回符合条件的元素组成的新集合
- (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate;

//使用指定的谓词过滤NSMutableArray,剔除集合中不符合条件的元素
- (void)filterUsingPredicate:(NSPredicate *)predicate;


常见用法

比较运算符

=、==:判断两个表达式是否相等,在谓词中===相同的意思都是判断,而没有赋值这一说

NSNumber *num = @123;
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF == 123"];//此处 = 与 == 的功能是相同的
if ([pre evaluateWithObject:num]) {
   
   
    NSLog(@"1");
} else {
   
   
    NSLog(@"2");
}

>=,=>:判断左边表达式的值是否大于或等于右边表达式的值

<=,=<:判断左边表达式的值是否小于或等于右边表达式的值

`>`:判断左边表达式的值是否大于右边表达式的值

<:判断左边表达式的值是否小于右边表达式的值

!=、<>:判断两个表达式是否不相等

BETWEEN:BETWEEN表达式必须满足表达式 BETWEEN {下限,上限}的格式,要求该表达式必须大于或等于下限,并小于或等于上限

BETWEEN的用法:

NSNumber *num = @123;
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF BETWEEN {40,123}"];
if ([pre evaluateWithObject:num]) {
    NSLog(@"1");
} else {
    NSLog(@"2");
}

逻辑运算符

AND、&&:逻辑与,要求两个表达式的值都为YES时,结果才为YES。

OR、||:逻辑或,要求其中一个表达式为YES时,结果就是YES

NOT、 !:逻辑非,对原有的表达式取反

AND、&&

NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];//此处AND 和 &&效果相同
 NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
 NSLog(@"filterArray:%@", filterArray);

NOT、 !:此处用了IN,不了解的读者可以先往后看

NSArray *filterArray = @[@"ab", @"abc"];
 NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
 NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);//取了array之中与filterArray的非交集

字符串比较运算符

  • BEGINSWITH:检查某个字符串是否以指定的字符串开头
  • ENDSWITH:检查某个字符串是否以指定的字符串结尾
  • CONTAINS:检查某个字符串是否包含指定的字符串
  • LIKE:检查某个字符串是否匹配指定的字符串模板。其之后可以跟?代表一个字符和代表任意多个字符两个通配符。比如"name LIKE ‘ac’",这表示name的值中包含ac则返回YES;"name LIKE '?ac’",表示name的第2、3个字符为ac时返回YES。?代表的是一个未知符号,*可以代表模糊搜索不指定个数,可以看看下文的例子
  • MATCHES:检查某个字符串是否匹配指定的正则表达式。值得一提的是正则表达式的执行效率是最低的,但其功能是最强大的,也是我们最常用的。

下面我们将每个比较运算符都进行举例(对于比较运算符来说,是不用区分大小写的,即 BEGINSWITH 和 beginwith 相同

注:字符串比较都是区分大小写和重音符号的。如:café和cafe是不一样的,Cafe和cafe也是不一样的。如果希望字符串比较运算不区分大小写和重音符号,请在这些运算符后使用[c],[d]选项。其中[c]是不区分大小写,[d]是不区分重音符号,其写在字符串比较运算符之后,比如:name LIKE[cd] ‘cafe’,那么不论name是cafe、Cafe还是café上面的表达式都会返回YES。

BEGINSWITH:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa",@"alice",@"你好",@"啊",nil];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值