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