NSPredicate 的使用

2017-09-12  本文已影响0人  liangZhen

在我们写程序中往往会遇到一些查找的操作,比如一个数组里面全是PersionModel,如果要找出年龄大于40岁的如何操作?大多数人可能会用循环+判断条件来找出符合要求的PersionModel。但是如果使用NSPredicate,不需要循环两行代码即可,是不是很爽?下面我们简单的看一下NSPredicate的使用。

NSPredicate的使用步骤只需两步

  1. 创建一个NSPredicate并加上
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"筛选条件"];

2.将所有数据放入predicate进行过滤

NSArray *temp = [persions filteredArrayUsingPredicate:predicate];

是不是爽翻了?这里面的关键点就是设置筛选条件,先看一下NSPredicate的一些保留关键字

AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE

保留关键字是不区分大小写的,这里推荐使用大写。下图是对关键字的简单解释说明。

原谅我无耻的盗图

有了这个图表,我们就可以对照着写几个例子了。
下面的例子都用到的公共代码

 NSMutableArray * persions = [NSMutableArray array];
    
    NSArray * names = @[@"张三",@"李四",@"王二",@"麻子",@"马户",@"朱雀"];
    NSArray * ages = @[@120,@148,@93,@42,@39,@17];
    
    NSArray * sunNames = @[@"张三儿",@"李四儿",@"王二儿",@"麻子儿",@"马户儿",@"朱雀儿"];
    NSArray * sunAges = @[@120,@148,@93,@42,@39,@17];

    for (NSInteger i = 0; i < names.count; i++) {
        Persion * persion = [[Persion alloc] init];
        persion.name = names[i];
        persion.age = ages[i];
        
        Sun * sun = [[Sun alloc] init];
        sun.name = sunNames[i];
        sun.age = sunAges[i];
        persion.sun = sun;
        [persions addObject:persion];
    }

1.找出所有名字在指定结合里面的所有对象(这里使用了关键字IN)

 //自己儿子的名字是@[@"王二儿",@"朱雀儿",@"张三儿"]的所有对象
    NSArray * sunName = @[@"王二儿",@"朱雀儿",@"张三儿"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.sun.name IN%@",sunName];
    NSArray *temp = [persions filteredArrayUsingPredicate:predicate];
//如果想要获取除去自己儿名字是[@"王二儿",@"朱雀儿",@"张三儿"]的所有对象,只需在筛选条件加NOT即可
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF.sun.name IN%@)",sunName];

2.找出年龄在某一区间的所有对象

    //年龄在39-120之间的 这里是闭区间[39, 120]
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age BETWEEN{39,120}"];
    NSArray *temp = [persions filteredArrayUsingPredicate:predicate];
   //判断条件换成下面的代码效果一样。
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age >= 39 && self.age <= 120"];

3.名字中包含“二”的所有对象

   //名字中包含 ‘二’ 的所有对象
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name LIKE[cd] '*二*'"];
    NSArray *temp = [persions filteredArrayUsingPredicate:predicate];

  // *为通配,与下面的CONTAINS关键字筛选条件一样
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name CONTAINS[cd] '二'"];

   //名字中是以 ‘王’开头所有对象
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name BEGINSWITH[cd] '王'"];
    NSArray *temp = [persions filteredArrayUsingPredicate:predicate];
    //另外 ENDSWITH 用法与上面的BEGINSWITH相似。是以**为结尾的所有对象

4.自己儿子的age与自己age相等的所有对象

    //自己的age == sun.age 的
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age == self.sun.age"];
    NSArray *temp = [persions filteredArrayUsingPredicate:predicate];
   //如果不相等就是 !=

看到这里你是不是再也不想使用循环了?当然NSPredicate 的使用不仅于此,更多API大家可以command进入查看。

上一篇下一篇

猜你喜欢

热点阅读