1、定义谓词
NSPredicate(谓词),用于定义一个逻辑条件,通过该条件可执行搜索或过滤操作。
谓词由NSPredicate对象来代表,创建一个NSPredicate对象使用NSPredicate的predicateWithFormat:方法;
Student *stu = [[Studentalloc] initWithStuName:@"张三"stuAge:16stuSex:1];
//定义谓词
NSPredicate *pre1 = [NSPredicatepredicateWithFormat:@"stuAge > 18"];
创建谓词之后,即可使用NSPredicate的evaluateWithObject:方法执行判断:
//使用谓词执行判断
BOOL result = [pre1 evaluateWithObject:stu];
if (result) {
NSLog(@"大于18岁");
}
else
NSLog(@"未成年");
2、判断对象本身
如果要对对象本身就需要使用SELF
NSString *testStr = @"李良成";
//判断是否包含良
NSPredicate *pre5 = [NSPredicatepredicateWithFormat:@"SELF LIKE '*良*'"];
if([pre5 evaluateWithObject:testStr]){
NSLog(@"包含\"良\"");
}else{
NSLog(@"不包含\"良\"");
}
3、使用谓词过滤集合(数组)
谓词的一个常用功能就是对集合进行过滤,当程序使用谓词对集合元素进行过滤时,程序会自动遍历集合元素,并根据集合元素来计算谓词的值,只有当根据某个元素计算谓词并返回YES时,该集合元素才会被保留下来。
NSArray 提供了如下方法使用谓词过滤数组
-(NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定谓词过滤NSArray数组,返回数组中符合谓词条件的元素组成新的数组
NSSet提供了如下方法使用谓词来过滤集合:
-(NSSet *)filteredSetUsingPredicate:(NSPredicate *)predicate:使用指定谓词过滤集合,返回该集合中符合谓词条件的元素组成新的集合
Student *stu1 = [[Studentalloc] initWithStuName:@"张三"stuAge:16stuSex:1];
Student *stu2 = [[Studentalloc] initWithStuName:@"李四"stuAge:19stuSex:0];
Student *stu3 = [[Studentalloc] initWithStuName:@"王五"stuAge:15stuSex:1];
Student *stu4 = [[Studentalloc] initWithStuName:@"赵六"stuAge:20stuSex:0];
NSArray *array = @[stu1,stu2,stu3,stu4];
NSPredicate *pre6 = [NSPredicatepredicateWithFormat:@"stuAge>18"];
NSArray *fliterArray = [array filteredArrayUsingPredicate:pre6];
NSLog(@"大于18的人有:%@",fliterArray);
4、使用谓词过滤可变集合(数组)
NSMutableArray提供了如下方法使用谓词来过滤数组:
-(void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSMutableArray数组,删除该数组中不符合条件的元素
NSMutableSet提供了如下方法使用谓词来过滤集合:
-(void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的谓词过滤NSMutableSet集合,删除该集合中不符合条件的元素
//使用谓词过滤可变集合
NSMutableArray *muArr = [NSMutableArrayarray];
NSMutableSet *muSet = [NSMutableSetset];
for (int i =0; i < 10; i++) {
NSString *nameStr = @"";
if (i > 5) {
nameStr = [NSString stringWithFormat:@"lisi%i",i];
}else{
nameStr = [NSString stringWithFormat:@"zhangsan%i",i];
}
[muArr addObject:nameStr];
[muSet addObject:nameStr];
}
//创建谓词,模糊查找自身对象是否包含'zhangsan'
NSPredicate *pre7 = [NSPredicatepredicateWithFormat:@"SELF like '*zhangsan*'"];
[muArr filterUsingPredicate:pre7];
NSLog(@"%@",muArr);
[muSet filterUsingPredicate:pre7];
NSLog(@"%@",muSet);
5、在谓词中使用格式化符
如果需要在谓词表达式中使用变量,则可以考虑在谓词中使用格式化参数。在谓词中支持一下两个格式化符:
%k,该格式化符用于动态传入属性名
%@,该格式化符用于动态设置属性值
Person *person = [[Person alloc] initWithData:@"zhangsan" aAge:16 aEmail:@"1111@q.com"];
person.score = 50.5f;
//创建谓词,要求年龄大于等于18岁
NSPredicate *preAge = [NSPredicate predicateWithFormat:@"age>=%@",@18];
if([preAge evaluateWithObject:person]){
NSLog(@"成年");
}else{
NSLog(@"未成年");
}
//创建谓词,要求分数大于等于60分
//@"%K>=%@",score作为%K的值,@60.0作为%@的值
//%K,K一定要大写
NSString *score = @"score";
NSPredicate *preScore = [NSPredicate predicateWithFormat:@"%K>=%@",score,@60.0f];
if([preScore evaluateWithObject:person]){
NSLog(@"及格");
}else{
NSLog(@"不及格");
}
6、谓词表达式语法
谓词表达式由表达式、运算符和值组成
=、==:判断是否等于某个值
>=、=>:判断是否大于等于某个值
<=、=<:判断是否小于等于某个值
>:判断是否大于某个值
<:判断是否小于某个值
!=、<>:判断不等于某个值
BETWEEN:BETWEEN表达式必须满足"表达式 BETWEEN{上限,下限}"的格式,判断某个值是否在这个区间
AND 、&&:逻辑与,要求两个表达式的值都为YES时,结果才为YES
OR、||:逻辑或,要求任何一个表达式的值为YES时,结果才为YES
NOT、!:逻辑非,用于对原有表达式的结果取反
BEGINSWITH:检查某个字符串是否以指定的子串开头
NEDSWITH:检查某个字符串是否以指定的子串结尾
CONTAINS:检查某个字符串是否包含指定的子串
LIKE:相当于模糊查询某个字符串,LIKE后面可使用字符串模板,该字符串模板允许使用*和?两个通配符,其中*代表任意多个字符,?代表一个字符
MATCHES:检查某个字符串是否匹配指定的正则表达式,虽然正则表达式的功能是强大,但是执行效率是最低的。