NSPredicate用于定义一个逻辑条件,通过该条件可以执行搜索或内存中的过滤操作。
3个子类:
- NSComparisonPredicate
- NSCompoundPredicate
- NSExpression
返回BOOL结果
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like 's*'"];
YKArticleModel *model = [[YKArticleModel alloc]init];
model.uName = @"sun";
[pre evaluateWithObject:model];
NSArray 提供的过滤集合
filteredArrayUsingPredicate
使用指定的谓词过滤NSArray集合,返回该集合中符合谓词条件的元素组成的新集合
NSPredicate *pre = [NSPredicate predicateWithFormat:@""];
NSArray *array = [NSArray array];
[array filteredArrayUsingPredicate:pre];
filterUsingPredicate
过滤掉不符合的集合
NSPredicate *pre = [NSPredicate predicateWithFormat:@""];
NSMutableArray *array = [NSMutableArray array];
[array filterUsingPredicate:pre];
NSSet提供的过滤集合
返回该集合中符合谓词条件的元素组成的新集合
filteredSetUsingPredicate
NSPredicate *pre = [NSPredicate predicateWithFormat:@""];
NSSet *set = [[NSSet alloc]init];
[set filteredSetUsingPredicate:pre];
filteredSetUsingPredicate
过滤掉不符合的集合
NSPredicate *pre = [NSPredicate predicateWithFormat:@""];
NSMutableSet *set = [[NSMutableSet alloc]init];
[set filteredSetUsingPredicate:pre];
实例
过滤大于50的值
NSMutableArray *array = [NSMutableArray arrayWithObjects:@50,@12,@53,@65,@43,@67, nil];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF > 50"];
[array filterUsingPredicate:pred];
commentCount包含39的model
YKArticleModel *model = [[YKArticleModel alloc]init];
model.commentCount = @"143";
YKArticleModel *model1 = [[YKArticleModel alloc]init];
model.commentCount = @"235";
YKArticleModel *model2 = [[YKArticleModel alloc]init];
model.commentCount = @"39";
NSSet *set = [NSSet setWithObjects:model1,model,model2, nil];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"commentCount CONTAINS '39'"];
[set filteredSetUsingPredicate:pre];
在谓词中使用占位符参数
我们能发现,像上例中
commentCount
,是固定的,不能动态的更改,接下来就是讲,如何使用占位符。
-
%K
该占位符用于动态传入属性名 -
%@
该占位符用于动态设置属性值
此外,还可以在谓词表达式中使用动态改变的属性值,类似于环境变量,$SUBSTR 是一个可以动态变化的值,随着程序改变了$SUBSTR的值,
该谓词表达式的比较条件就可以动态改变。
[NSPredicate predicateWithFormat:@"name CONTAINS $SUBSTR"];
YKArticleModel *model = [[YKArticleModel alloc]init];
model.commentCount = @"143";
YKArticleModel *model1 = [[YKArticleModel alloc]init];
model.commentCount = @"235";
YKArticleModel *model2 = [[YKArticleModel alloc]init];
model.commentCount = @"39";
NSString *key = @"commentCount";
NSString *value = @"143";
NSSet *set = [NSSet setWithObjects:model1,model,model2, nil];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K CONTAINS %@",key,value];
[set filteredSetUsingPredicate:pre];
YKArticleModel *model = [[YKArticleModel alloc]init];
model.commentCount = @"143";
YKArticleModel *model1 = [[YKArticleModel alloc]init];
model.commentCount = @"235";
YKArticleModel *model2 = [[YKArticleModel alloc]init];
model.commentCount = @"39";
NSSet *set = [NSSet setWithObjects:model1,model,model2, nil];
//model中,title包含$SUBSTR子串
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K CONTAINS $SUBSTR",@"title"];
[set filteredSetUsingPredicate:pre];
//指定$SUBSTR ,过滤掉标题包含“新闻”的model。
NSPredicate *pre1 = [pre predicateWithSubstitutionVariables:@{@"SUBSTR":@"新闻"}];
//过滤
[set filteredSetUsingPredicate:pre1];
其实你也发现了,感觉多此一举的感觉。指定了key与value
就行,为何还要来一个$SUBSTR这一步。
谓词表达式语法
表达式 | 说明 |
---|---|
=, == | 判断是否相等 |
>= ,=> | 大于等于 |
<= ,=< | 小于等于 |
> | 大于 |
< | 小于 |
!= ,<> | 不等于 |
BETWEEN | 表达式BETWEEN{上限 下限},之间的值 |
AND ,&& | 逻辑和 |
OR , || | 逻辑或 |
NOT ,! | 逻辑非 |
BEGINSWITH | 检查某个字符串是否以指定子串开头 |
ENDSWITH | 检查某个字符串是否以子串结尾 |
CONTAINS | 检查某个字符串是否包含指定子串 |
LIKE | 检查某个字符串是否匹配指定的字符串模板,* ,?。* 表示多个,?表示一个 |
MATCHES | 指定的正则表达式 |
ANY ,SOME : | 只要集合中任意一个元素满足条件,返回YES eg: ANY chilen.age<18 |
ALL: | 满足所有返回YES eg:ALL chilen.age<18 |
NONE: | 没有任何元素满足返回YES |
IN | 当左边表达式的值出现在右边的集合中。 |
array[index] | 返回array 数组中index 索引处的元素 |
array[FIRST] | 返回array第一个元素 |
array[LAST] | 返回array最后一个元素 |
array[SIZE] | 返回array的个数 |
FALSE , NO | 逻辑假 |
TRUE ,NO | 逻辑真 |
NULL,NIL | 代表一个空值 |
SELF | 代表正在判断值的本身 |
“text”,'text' | 代表字符串 |
数组 | {'a','b','c','d'} |
数值直接量 | 1, 27 2.71818,19.75 |
十六进制 | 0X |
八进制 | 0o |
二进制 | 0b |
正则表达式
表达式 | 说明 |
---|---|
. | 匹配除换行符外的任意字符 |
\w | 匹配字母或者数字的字符 |
\W | 匹配任意不是字母或数字的字符 |
\s | 匹配任意的空白符(空格、制表符、换行符) |
\S | 匹配任意不是空白符的字符 |
\d | 匹配任意数字 |
\D | 匹配任意非数字的字符 |
\b | 匹配单词的结尾或者开头的字符 |
\B | 匹配任意不是单词结尾或开头的字符 |
[^x] | 匹配任意非x的字符。如[^[a-z]]匹配非小写字母的任意字符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
* | 匹配重复任意次数 |
+ | 匹配重复一次以上的次数 |
? | 匹配一次或零次 |
{n} | 匹配重复n次 |
{n,} | 匹配重复n次或n次以上 |
{n,m} | 匹配重复最少n次最多m次 |
NSString *email = @“nijino_saki@163.com”;
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isValid = [predicate evaluateWithObject:email];
网友评论