应用环境:
当一个数组容器中有很多相同对象时,如果想按照某种要求对数组容器中的满足条件的对象进行筛选时,有两种方法
一 就是最笨的方法遍历数组 用if条件语句进行筛选
二 可以用最简洁的方法 就是利用谓词进行筛选过滤
谓词的使用方法:
1> 先以某种筛选条件进行初始化创建一个NSPredicate类的对象 即
NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"self.age<30"];
2> 再使用 filteredArrayUsingPredicate:方法为存放对象的数组绑定筛选条件并将满足条件的对象(可以说是对象地址)存放到一个新的数组中,如下所示:NSArray *filterArray1 = [personsfilteredArrayUsingPredicate:predicate];
3> 筛选语句有以下几种:
(1)> ,<,= 即@"对象属性名> 某个值"
(2)&& 用于连接多个必须同时满足的条件 条件1&&条件2 表示且 例如:@"name=='小白'&&age>40"
(3)|| 用于连接多个或关系的条件语句 表示满足其中一个条件即可 例如:@"name=='小白'||age>40"
(4)IN 包含的意思后面跟花括号,花括号内的值用逗号隔开。表示指定的属性值是{}内中的一个。如下所示:@"self.name IN {'小黑','Cose'} || self.age IN {20,50}"
(5)BEGINSWITH 以什么开头,即以一个或多个或指定格式的字符串开头。例如:@"name BEGINSWITH 'a' "
(6)ENDSWITH 以什么结尾
(7)CONTAINS 是否包含指定的一个或多个字符以及指定格式的字符串。例如:@"self.name CONTAINS 'se' "
(8)LIKE: 模糊查询 用到的格式符如下:
* 星号表示匹配0个或多个字符
? 问号表示一个字符
例如:@"self.name LIKE '?a*' "
新建工程代码如下:
Person.h
<span style="font-size:18px;">// // Person.h // 谓词的具体使用 // // Created by apple on 15/9/21. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSUInteger age; // UInteger表示无符号数,全为正整数 +(id)personWithName:(NSString *)name andAge:(NSUInteger) age; @end </span>Person.m
<span style="font-size:18px;">// // Person.m // 谓词的具体使用 // // Created by apple on 15/9/21. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "Person.h" @implementation Person +(id)personWithName:(NSString *)name andAge:(NSUInteger ) age { Person *person = [[Person alloc] init]; person.name = name; person.age = age; return [person autorelease]; } -(void) dealloc { [_name release]; [super dealloc]; } -(NSString *) description { NSString *s = [NSString stringWithFormat:@"name= %@, age= %ld",_name,_age]; return s; } @end </span>main.m
<span style="font-size:18px;">// // main.m // 谓词的具体使用 // // Created by apple on 15/9/21. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *persons = [NSArray arrayWithObjects: [Person personWithName:@"mac" andAge:20], [Person personWithName:@"hate" andAge:25], [Person personWithName:@"999ere" andAge:30], [Person personWithName:@"aruse" andAge:28], [Person personWithName:@"Erse" andAge:30], [Person personWithName:@"Ahon" andAge:29], [Person personWithName:@"Cose" andAge:30], [Person personWithName:@"小白" andAge:20], [Person personWithName:@"Iog" andAge:30], [Person personWithName:@"小白" andAge:50], [Person personWithName:@"小黑" andAge:30] , nil]; // 定义谓词对象,谓词对象中包含了过滤条件 // self: 表示的是数组存放的对象 当条件不确定时用格式符指定变量 // NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age<%d",30]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.age<30"]; //1 使用谓词条件过滤数组中的元素,过滤之后返回查询的结果 NSArray *filterArray1 = [persons filteredArrayUsingPredicate:predicate]; NSLog(@"filterArray1 (age<30)= %@\n",filterArray1); // 2 使用&&符号 NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"name=='小白'&&age>40"]; NSArray *filterArray2 = [persons filteredArrayUsingPredicate:predicate2]; NSLog(@"filterArray2 (name='小白'&&age>40)= %@\n",filterArray2); // 3. IN(包含的意思) 后面跟花括号 NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"self.name IN {'小黑','Cose'} || self.age IN {20,50}"]; NSArray *filterArray3 = [persons filteredArrayUsingPredicate:predicate3]; NSLog(@"filterArray3 (self.name IN {'小黑','Cose'} || self.age IN {20,50})= %@\n",filterArray3); // 4 BEGINSWITH 判断字符串以指定的什么开头的 NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a' "]; NSArray *filterArray4 = [persons filteredArrayUsingPredicate:predicate4]; NSLog(@"filterArray4 (name BEGINSWITH 'a' )= %@\n",filterArray4); // 5 ENDSWITH 判断字符串是否以指定的字符或字符串结尾的 NSPredicate *predicate5 = [NSPredicate predicateWithFormat:@"name ENDSWITH 'e' "]; NSArray *filterArray5 = [persons filteredArrayUsingPredicate:predicate5]; NSLog(@"filterArray5 (name ENDSWITH 'e' )= %@\n",filterArray5); // 6 CONTAINS 是否包含指定字符或字符串 NSPredicate *predicate6 = [NSPredicate predicateWithFormat:@"self.name CONTAINS 'se' "]; NSArray *filterArray6 = [persons filteredArrayUsingPredicate:predicate6]; NSLog(@"filterArray6 (name CONTAINS 'a' )= %@\n",filterArray6); // 7 like 模糊查询 /* * 星号匹配代表0个或多个字符 ? 问号代表一个字符 */ NSPredicate *predicate7 = [NSPredicate predicateWithFormat:@"self.name LIKE '?a*' "]; NSArray *filterArray7 = [persons filteredArrayUsingPredicate:predicate7]; NSLog(@"filterArray7 (self.name LIKE '?a*' )= %@\n",filterArray7); } return 0; } </span>运行结果如下: