美文网首页
谓词: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