首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CompoundPredicate NSPredicate

CompoundPredicate NSPredicate
EN

Stack Overflow用户
提问于 2016-04-22 19:10:16
回答 3查看 200关注 0票数 1

例如,我有三个NSPredicates。

代码语言:javascript
运行
复制
NSPredicate *pred1 = [NSpredicate ...];
NSPredicate *pred2 = [NSpredicate ...];
NSPredicate *pred3 = [NSpredicate ...];

我从服务器字符串中得到了我需要组合谓词的方式。

例如

代码语言:javascript
运行
复制
(1 OR 2 OR 3)
(1 OR 3) AND 2
3 OR (1 AND 2)

我如何在正确的条件下组合我的三个谓词,并给出括号?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2016-04-22 19:16:51

您可以像下面这样创建嵌套的NSCompoundPredicate

代码语言:javascript
运行
复制
NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[firstPredicate, secondPredicate]];
NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[thirdPredicate, fourthPredicate]];
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[orPredicate, andPredicate]];
票数 2
EN

Stack Overflow用户

发布于 2016-04-22 19:48:21

一种方法是从谓词中创建一个“真值表输入”,根据字符串生成一个组合谓词,然后使用真值表数据对其进行评估。

为了使谓词在真值表上工作,您需要将(1 OR 2) AND 3转换为(SELF[1]==YES OR SELF[2]==YES) AND SELF[3]==YES格式。你可以用正则表达式来实现:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
NSPredicate *pred = [NSPredicate predicateWithFormat:subst];

最后,你需要建立你的真值表。逐个评估谓词,并将结果放入NSArray。将未使用的元素放在索引0处,因为您的替换字符串使用基于1的索引。

现在,您可以使用之前准备的谓词了:

代码语言:javascript
运行
复制
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

我对真值表data1data2使用了固定值。您需要计算谓词pred1..predN,并将结果放入NSArray的位置1..N。

票数 1
EN

Stack Overflow用户

发布于 2016-04-22 19:32:45

您可以使用此代码示例:

代码语言:javascript
运行
复制
NSPredicate *p1 = [NSPredicate ];


NSPredicate *p2 = [NSPredicate "];

NSPredicate *p3 = [NSPredicate "];

在最终谓词中

代码语言:javascript
运行
复制
    NSPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2,p3]];

这项工作类似于(p1、p2和p3)

您还可以将orPredicateWithSubpredicates、notPredicateWithSubpredicate与nscompoundpredicate一起使用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36792248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档