iOS之NSPredicate谓词

NSPredicate用于定义一个逻辑条件,通过该条件可以执行搜索或内存中的过滤操作。

3个子类:
1. NSComparisonPredicate
2. NSCompoundPredicate
3. 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 S U B S T R 是 一 个 可 以 动 态 变 化 的 值 , 随 着 程 序 改 变 了 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];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值