谓词(am/is/are)---NSPredicate
作用:判断条件表达式的求值返回真或假的过程
使用步骤:
- 定义NSPredicate对象并指定条件
- 调用谓词的evaluateWithObject方法判断指定条件是否满足
示例:
NSPredicate*predicate = [NSPredicate predicateWithFormat:@"self CONTAINS '1'"];
NSString *text = @"1234";
NSLog(@"%d", [predicate evaluateWithObject:text]);
案例:
1.创建Person的对象数组
2.查询判断姓名和年龄的过滤方法
- 传统方法:
NSMutableArray*result = [NSMutableArray arrayWithCapacity:personList.count];
for (NSInteger i = 0; i < personList.count; i++) {
Person *person = personList[i];
// 用户年龄小于5 同时用户姓名中包含“1”字符串
if (person.age < 5&& NSNotFound != [person.name rangeOfString:@"1"].location) {
[result addObject:person];
}
}
return result;
- 谓词方法:
NSPredicate*predicate = [NSPredicate predicateWithFormat:@"name CONTAINS '1' && %K BETWEEN {%d, %d}", @"age", 5, 15];
NSArray*result = [personList filteredArrayUsingPredicate:predicate];
谓词的条件指令
1.比较运算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"
2.范围运算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
3.字符串本身:SELF
例:@"SELF == 'APPLE'"
4.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
5.通配符:LIKE - 模糊查询
例:@"name LIKE[cd] 'er'" //代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er'"
注: 星号 "*" : 代表0个或多个字符
问号 "?" : 代表一个字符
6.正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。
- 合计操作
ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。
提示:
- 1、谓词中的匹配指令关键字通常使用大写字母
- 谓词中可以使用格式字符串
- 如果通过对象的key path指定匹配条件,需要使用 %K
// ViewController.m
// NSPredicate(谓词)
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self test2];
}
/**
* 过滤自定义对象
*/
- (void)test2{
Person *p1 = [Person new];
p1.name = @"zhangsan";
p1.age = 17;
Person *p2 = [Person new];
p2.name = @"lisi";
p2.age = 15;
Person *p3 = [Person new];
p3.name = @"wangwu";
p3.age = 20;
Person *p4 = [Person new];
p4.name = @"zhangquandan";
p4.age = 32;
Person *p5 = [Person new];
p5.name = @"laowang";
p5.age = 23;
NSArray *persons = @[p1,p2,p3,p4,p5];
//过滤名字里包含"zhang"
//创建谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[self.name](http://self.name) CONTAINS 'zhang'"];
NSArray<Person *> *results = [persons filteredArrayUsingPredicate:predicate];
// NSLog(@"%@",[results valueForKey:@"name"]);
//谓词单独作用于某个对象
BOOL flag = [predicate evaluateWithObject:p5];
if (flag == YES) {
NSLog(@"包含zhang");
}else{
NSLog(@"不包含zhang");
}
}
- (void)test1{
NSArray *array = @[@"3523426",@"325638",@"235622246",@"54748",@"435622267"];
//找出数组中含有"222"的元素
//使用谓词(条件)过滤数组
//创建谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self CONTAINS '222'"];
//结果
NSArray *results = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@",results);
}
@end
网友评论