NSPredicate 的使用

| NSPredicate是什么?
NSPredicate 是预测的意思 但是我们常翻译成谓词

| 它可以干什么?
使用NSPredicate可以定义模糊查询条件 根据一定的条件 我们就可以从一个数组中快速找出 符合一定条件的元素对象

-------------------------目录-------------------------

  1. 为‘搜索年龄大于20的对象’
    2.除了 > 号之外 我们还可以用IN 查询两个数组的交集
    3.同时除了IN 之外 BETWEEN可以获取一定范围的值
    4.这里以等于号==为例
    5.用到的关键字 LIKE 他后面也可以写[cd]格式符号
  • 案例一: 为‘搜索年龄大于20的对象’ 然后再把点击左上角按钮的业务代码修改为如下:
- (IBAction)sortAge:(id)sender {
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age>20"]; //创建NSPredicate对象 并定义查询条件
    
    self.datas =   [[self.datas filteredArrayUsingPredicate:predicate] mutableCopy]; //使用数组的filteredArrayUsingPredicate方法 获取符合我们指定条件的对象
   [self.tableView reloadData]; 

}
// 这里的self.datas 我理解的是 一个个Model(里面包含 age 字段)

这个时候我们点击左上角的按钮 就可以查询出数组里面 年龄大于20的对象

  • 案例二: 除了 > 号之外 我们还可以用IN 查询两个数组的交集
    我们新建一个程序 来测试IN 的用法 我们在ViewDidload方法里面 写入如下代码:
- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array1 = [NSArray arrayWithObjects:@1,@2,@3,@4,@5,@6,@7,@8, nil];
    NSArray *array2 = [NSArray arrayWithObjects:@4,@6, nil];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF in%@",array2]; //SELF 代表本身 IN可以大写也可以小写
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate]; //表示获取 array2 和 array1中的交集
NSLog(@"temp ====\n%@",temp); }
  • 案例三:同时除了IN 之外 BETWEEN可以获取一定范围的值 示例代码如下:
- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *array1 = [NSArray arrayWithObjects:@100,@20,@3,@4,@4,@6,@7,@1, nil];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,20}"];
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}

当然除了上面介绍的两个用法之外 还有其他的比较运算符>,<,==,>=,<=,!=

  • 案例四:这里以等于号==为例
- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array1 = [NSArray arrayWithObjects:@100,@20,@3,@4,@4,@6,@7,@1, nil];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF ==6"];
    
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}

同时还有以下与字符串操作相关的关键词 :

BEGINSWITH :以某个字符串开头

ENDSWITH :以某个字符串结尾

CONTAINS :是否包含某个字符串

同时这三个关键词后面还可以跟上一些格式符号 如:BEGINSWITH[cd] c表示不区分大小写 d表示不区分发音符号 cd就可以表示即不区分大小写 也不区分发音符号

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"anne",@"reserved",@"control" ,@"type",@"soure",@"version",nil];
    
    //查询出包含e这个字符的字符串
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] 'E' "];
    
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}
- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"anne",@"reserved",@"control" ,@"type",@"soure",@"version",nil];
    
    //查询出以a这个字符开头的字符串
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] 'a' "];
    
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"anne",@"reserved",@"control" ,@"type",@"soure",@"version",nil];
    
    //查询出以e这个字符结尾的字符串
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF ENDSWITH[cd] 'e' "];
    
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}
  • 案例五: 还有一个你可能会用到的关键字 LIKE 他后面也可以写[cd]格式符号
- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"anne",@"reserved",@"control" ,@"type",@"soure",@"version",nil];
    
    //查询出包含e这个字符的字符串
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] '*e*' "]; //*表示通配符
    
    NSArray *temp = [array1 filteredArrayUsingPredicate:predicate];
    
    NSLog(@"temp ====\n%@",temp);
}
最后附上所有的相关的条件字符.png

参考于文章

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接:http://www.jianshu.com/p/b2694972863e iOS Predicate ...
    wintersal阅读 4,302评论 0 49
  • 在我们写程序中往往会遇到一些查找的操作,比如一个数组里面全是PersionModel,如果要找出年龄大于40岁的如...
    liangZhen阅读 5,272评论 0 1
  • 最近在看一个开源项目,里面用到了NSPredicate类,感觉Foundation提供的NSPredicate类及...
    sunshinelww阅读 5,412评论 0 0
  • 糟透了 早点睡 早点起 妈:她喜欢读书,不然再找个学校去读书吧。 我:好啊好啊,我喜欢读书! 爸:读什么读,找个人...
    ShAvIn阅读 4,084评论 0 0
  • 减肥是女人永恒不变的话题,每个女人都在为自己的体重发愁。有的甚至会使用一些病态的方式,如催吐法或者是吃泻药来减肥。...
    蝎子小猫咪阅读 1,898评论 3 11