定义 & 作用
作用:判断条件表达式的求值返回真或假的过程
逻辑指令
- 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);