美文网首页
NSPredicate 的使用

NSPredicate 的使用

作者: liangZhen | 来源:发表于2017-09-12 18:30 被阅读0次

    在我们写程序中往往会遇到一些查找的操作,比如一个数组里面全是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进入查看。

    相关文章

      网友评论

          本文标题:NSPredicate 的使用

          本文链接:https://www.haomeiwen.com/subject/gvbfsxtx.html