美文网首页
谓词:NSPredicate

谓词:NSPredicate

作者: younger_times | 来源:发表于2017-12-18 17:29 被阅读11次

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 是一个可以动态变化的值,随着程序改变了$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];

相关文章

网友评论

      本文标题:谓词:NSPredicate

      本文链接:https://www.haomeiwen.com/subject/xkbmwxtx.html