NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
一、NSPredicate的基本用法
1.比较运算符
- =、==:判断两个表达式是否相等,在谓词中=和==是相同的意思,没有赋值一说。
- >=、=>:判断左边的值是否大于或等于右边
- <=、=<:判断左边的值是否小于或等于右边
- >:判断左边的值是否大于右边
- <:判断左边的值是否小于右边
- !=、<>:判断两个表达式是否不相等
- BETWEEN:BETWEEN表达式必须满足表达式 BETWEEN {下限,上限}的格式,要求该表达式必须大于或等于下限,并小于或等于上限
NSNumber *number = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self = 123"];
BOOL result = [predicate evaluateWithObject:number];
//result is YES
NSNumber *number = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self between {123, 200}"];
BOOL result = [predicate evaluateWithObject:number];
//result is YES
2.比较运算符
- AND、&&:逻辑与
- OR、||:逻辑或
- NOT、!:逻辑非
NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > 2 && self < 5"];
NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];
//filterArray is @[@3, @4];
3.字符串比较运算符
- BEGINSWITH:是否以指定字符串开头;
- ENDSWITH:是否以指定字符串结尾;
- CONTAINS:是否包含指定字符串;
- LIKE:是否匹配指定字符串模版;
- MATCHES:是否匹配指定的正则表达式;
1.以abc开头:beginswith 'abc'; </br> 2.匹配模版:"name like 'abc'":表示name的值中包含abc则返回YES;"name like '?abc*'":表示name的第2、3、4个字符为abc时返回YES;</br>3.正则表达式的效率最低,但功能最强大。
字符串比较都是区分大小写和重音符号的。如:café和cafe是不一样的,Cafe和cafe也是不一样的。如果希望字符串比较运算不区分大小写和重音符号,请在这些运算符后使用[c],[d]选项。其中[c]是不区分大小写,[d]是不区分重音符号,其写在字符串比较运算符之后,比如:name LIKE[cd] 'cafe',那么不论name是cafe、Cafe还是café上面的表达式都会返回YES。
4.集合运算符
- ANY、SOME:集合中任意一个元素满足条件,就返回YES。
- ALL:集合中所有的元素都满足条件,才返回YES。
- NONE:集合中没有任何元素满足条件就返回YES。
- IN:等价于SQL语句中的IN运算符。
NSArray *array = @[@1, @2, @3, @4, @5, @6, @7];
NSArray *filterArray = @[@1, @4, @8];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self in %@)", filterArray];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is @[@2, @3, @5, @6, @7];
5.保留字
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
注:虽然大小写都可以,但是更推荐使用大写来表示这些保留字
谓词用法
1.判断模型符合条件
首先定义一个模型
Person.h
@interface Person : NSObject
@property (nonatomic, copy ) NSString *name;
@property (nonatomic, assign) NSInteger age;
+(instancetype)Person:(NSString *)name Age:(NSInteger)age;
@end
ViewController.h
Person *person = [Person Person:@"张三" Age:15];
//1.判断姓名是否以“张”开头
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"name like '张*'"];//name必须是模型中已存在的属性
BOOL result = [predicate1 evaluateWithObject:person];
//result is YES
//2.判断年龄是否大于25
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"age > 25"]; //age必须是模型中已存在的属性
result = [predicate2 evaluateWithObject:person];
//result is NO
2.判断手机号
- (BOOL)checkPhoneNumber:(NSString *)phoneNumber {
NSString *regex = @"^[1][3-8]\\d{9}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:phoneNumber];
}
3.筛选数组
NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
// 过滤大于50的值
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
//该方法只有可变数组才有,不可变数组没有此方法
[arrayM filterUsingPredicate:pred1];
4.筛选数组中的模型
NSArray *array = @[[Person Person:@"张三" Age:12],
[Person Person:@"张云" Age:24],
[Person Person:@"李四" Age:25]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains '张'"];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is "[name = 张三, age = 12], [name = 张云, age = 24]"
5.谓词中的占位符参数
%K:用于动态传入属性名
%@:用于动态设置属性值
$VALUE:个人感觉是在声明变量
NSArray *array = @[[Person Person:@"张三" Age:12],
[Person Person:@"张云" Age:24],
[Person Person:@"李四" Age:25]];
NSString *property = @"name";
NSString *value = @"张";
//1.筛选出名字中包含"张"的;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K contains %@", property, value];
NSArray *resultArray = [array filteredArrayUsingPredicate:predicate];
//resultArray is "[name = 张三, age = 12], [name = 张云, age = 24]"
//2.筛选出年龄大于24的;
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"%K > $Value", @"age"];
//必须加上下面这句,不然会报错。$Value(Value可以随便改,统一就行)个人感觉是声明一个变量,下面是给变量赋值。
predicate2 = [predicate2 predicateWithSubstitutionVariables:@{@"Value":@24}];
NSArray *resultArray2 = [array filteredArrayUsingPredicate:predicate2];
//resultArray2 is "[name = 李四, age = 25]"
网友评论