1.NSPredicate的作用
Cocoa用NSPredicate描述查询方式。
2.创建谓词
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"name == 'XXX'"];
3.使用谓词
BOOL match = [predicate evaluateWithObject:car];
NSLog(@"%s",(match)?"YES":“NO”);
-evaluateWithObject:通知接受对象(谓词)根据指定的对象计算自身的值。此处,接受对象为car,使用name作为键路径,应用valueForKeyPath:方法获得名称。然后,它将自身的值和“XXX”相比较。
另一种形式:
predicate = [NSPredicate predicateWithFormat:@"engine.power>150"];
match = [predicate evaluateWithObject:car];
如果需要检查的结果是对象集合:
NSArray *cars = [garage cars];
for(Car *car in [garage cars]){
if([predicate evaluateWithObject:car]){
.......;
}
}
可不可以不写for循环? 答:可以
-filteredArrayUsingPredicate:是NSArray数组中的一种类别方法,它将循环过滤数组内容,根据谓词计算每个对象的值,并且将值为YES的对象积累到将要返回的新数组中:
NSArray *results;
results = [cars filteredArrayUsingPredicate:predicate];
NSLog(@“%@”,result);
假设有个可变数组,需要剔除不属于该数组的所有项目。NSMutableArray具有的-filterUsingPredicate方法,可以实现:
NSMutableArray *carsCopy = [cars mutableCopy];
[carsCopy filterUsingPredicate:predicate];
NSSet也有类似的方法调用
4.格式说明符——避免硬编码
predicate = [NSPredicate predicateWithFormat:@"engine.power>%d",50];//当然50也可以是一个变量,将代码放入接口之中
注意一下2段代码的区别:
predicate = [NSPredicate predicateWithFormat:@"name == %@",@"XXX"];
predicate = [NSPredicate predicateWithFormat:@"name == %s","XXX"];
还可以通过%K指定键路径:
predicate = [NSPredicate predicateWithFormat:@"%K == %@",@"name",@"XXX"];
还可以将变量名放入字符串中(类似于环境变量):
NSPredicate predicateTemp = [NSPredicate predicateWithFormat:@"name ==$NAME",];
NSDictionary *varDict = [NSDictionary dicitionaryWithObjectsAndKeys:@"XXX",@"NAME",nil];
predicate = [predicateTemp predicateWithSubstiutionVariable:varDict];
5.运算符
谓词字符串语法支持使用括号语句拓展
BETWEEN:
NSArray *betweens = [NSArray arrayWithObjects:
[NSNumber numberWithInit:50],
[NSNumber numberWithInit:50],nil];
predicate = [NSPredicate predicateWithFormat:@"engine.power BETWEEN %@",betweens];
也可以使用Dictionary