例如,我有三个NSPredicates。
NSPredicate *pred1 = [NSpredicate ...];
NSPredicate *pred2 = [NSpredicate ...];
NSPredicate *pred3 = [NSpredicate ...];
我从服务器字符串中得到了我需要组合谓词的方式。
例如
(1 OR 2 OR 3)
(1 OR 3) AND 2
3 OR (1 AND 2)
我如何在正确的条件下组合我的三个谓词,并给出括号?
谢谢
发布于 2016-04-22 19:16:51
您可以像下面这样创建嵌套的NSCompoundPredicate
NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[firstPredicate, secondPredicate]];
NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[thirdPredicate, fourthPredicate]];
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[orPredicate, andPredicate]];
发布于 2016-04-22 19:48:21
一种方法是从谓词中创建一个“真值表输入”,根据字符串生成一个组合谓词,然后使用真值表数据对其进行评估。
为了使谓词在真值表上工作,您需要将(1 OR 2) AND 3
转换为(SELF[1]==YES OR SELF[2]==YES) AND SELF[3]==YES
格式。你可以用正则表达式来实现:
NSString *combine = @"(1 OR 2) AND 3";
NSError *err;
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:@"\\d+"
options:0
error:&err];
NSString *subst = [regex
stringByReplacingMatchesInString:combine
options:0
range:NSMakeRange(0, combine.length)
withTemplate:@"SELF[$0]==YES"];
NSLog(@"%@", subst);
接下来,您可以构建NSPredicate
NSPredicate *pred = [NSPredicate predicateWithFormat:subst];
最后,你需要建立你的真值表。逐个评估谓词,并将结果放入NSArray
。将未使用的元素放在索引0处,因为您的替换字符串使用基于1的索引。
现在,您可以使用之前准备的谓词了:
NSArray *data1 = @[@(NO), @(YES), @(NO), @(YES)];
NSArray *data2 = @[@(NO), @(NO), @(NO), @(YES)];
NSLog(@"%d", [pred evaluateWithObject:data1]); // Prints 1
NSLog(@"%d", [pred evaluateWithObject:data2]); // Prints 0
我对真值表data1
和data2
使用了固定值。您需要计算谓词pred1
..predN
,并将结果放入NSArray
的位置1..N。
发布于 2016-04-22 19:32:45
您可以使用此代码示例:
NSPredicate *p1 = [NSPredicate ];
NSPredicate *p2 = [NSPredicate "];
NSPredicate *p3 = [NSPredicate "];
在最终谓词中
NSPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2,p3]];
这项工作类似于(p1、p2和p3)
您还可以将orPredicateWithSubpredicates、notPredicateWithSubpredicate与nscompoundpredicate一起使用
https://stackoverflow.com/questions/36792248
复制相似问题