「OC」NSPredicate —— 使用谓词过滤元素
文章目录
前言
在暑假的3Gshared和学生管理系统之中,无论是登陆注册界面还是学生信息的输入,都存在需要我们对输入内容进行限制,于是我们就需要找到一个方法来解决对输入内容的判断限制,就是NSPredicate——谓词来过滤输入的元素。由于在暑假的几个任务之中只是知道如何使用,并没有仔细了解,乘着暑假剩下的空闲时间进行学习总结。
介绍
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配。使用NSPredicate可以有效地过滤和查询数据,提高数据处理的效率和灵活性。在Core Data中,NSPredicate常用于构建Fetch请求,从数据库中检索符合特定条件的数据。同时,在使用集合类(如NSArray、NSDictionary)时,NSPredicate也可以用来对数据进行过滤和排序。
首先我们需要了解构建谓词的常用运算符

此处为运算符的总结,看起来有点无从下手是吧,别急,后文在用到的时候还会再将功能贴出
了解完运算符,我们就可以了解如何使用NSPredicate,谓词表达式由表达式、运算符和值构成。
predicateWithFormat:创建一个谓词。
+ (id)predicateWithFormat:(NSString *)format...;
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];

最低0.47元/天 解锁文章
615

被折叠的 条评论
为什么被折叠?



