谓词 NSPredicate

NSPredicate使用详解
本文介绍如何使用NSPredicate进行数据过滤,包括基本逻辑指令的应用及格式字符串的正确使用方法,并提供了两个具体的示例来演示如何在代码中实现这些过滤条件。

定义 & 作用

作用:判断条件表达式的求值返回真或假的过程

逻辑指令

  • AND
  • OR
  • NOT
  • <
  • <=
  • ==
  • >
  • >=
  • BETWEEN {}
  • 字符串匹配 -BEGANWITH:以指定字符开始
    • ENDSWITH:以指定字符结束
    • CONTAINS:包含指定字符,可使用修饰符
    • c 不区分大小写
    • d 不区分注音符号
    • LIKE:使用通配符匹配
    • ? 一个字符
    • 0个或多个字符
  • 提示:

    • 谓词中的匹配指令关键字通常使用大写字母
    • 谓词中可以使用格式字符串
    • 如果用参数传递字符串,不需要使用 ”
    • 如果是整数,直接使用 %d
    • 如果通过对象的key path指定匹配条件,需要使用 %K

使用方法

方式一:

NSMutableArray *names = [NSMutableArray array];

    for (int i = 0; i < 50; i++) {
        [names addObject:[NSString stringWithFormat:@"zhangsan - %05d", arc4random_uniform(100000)]];
    }

    NSLog(@"%@", names);

    NSLog(@"----");

    // 要求:在 names 中找到所有包含 `7` 数字的字符串 并且 包含 `2`
    // self 用来过滤数组,self 就是数组中的对象 NSString
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS '7' AND self CONTAINS '2'"];
    NSArray *result = [names filteredArrayUsingPredicate:predicate];

    NSLog(@"%@", result);

方式二:

NSMutableArray *persons = [NSMutableArray array];

    for (int i = 0; i < 50; i++) {
        NSString *name = [NSString stringWithFormat:@"zhangsan - %05d", arc4random_uniform(100000)];
        NSInteger age = 10 + arc4random_uniform(20);

        Person *p = [[Person alloc] init];
        p.name = name;
        p.age = age;

        [persons addObject:p];
    }

    NSLog(@"%@", persons);

    NSLog(@"----");

    // 要求,姓名中包含 `8` 同时年龄大于 25
    /**
     注意点:
     1. 如果使用参数匹配字符串,不能使用 `'`,和 SQLite 的预编译很像
     2. 如果使用参数设置 `keyPath`,需要使用 `%K`

     应用场景:
     1. 过滤当前表格的数据源,结束之后 reloadData
     2. coreData 中,所有数据的过滤都是通过谓词来实现的!
     */
    NSString *searchName = @"8";
    NSString *keyName = @"name";

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@ AND age > 25", keyName, searchName];
    NSArray *result = [persons filteredArrayUsingPredicate:predicate];

    NSLog(@"%@", result);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值