Objective-C NSPredicate

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值