Objective-C NSPredicate

来源:互联网 发布:pc网络格斗游戏排行榜 编辑:程序博客网 时间:2024/05/19 02:42
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


0 0
原创粉丝点击