Ios 复合预测
例如,我有三个预测Ios 复合预测,ios,objective-c,core-data,nspredicate,Ios,Objective C,Core Data,Nspredicate,例如,我有三个预测 NSPredicate *pred1 = [NSpredicate ...]; NSPredicate *pred2 = [NSpredicate ...]; NSPredicate *pred3 = [NSpredicate ...]; 我从服务器字符串中了解了我需要如何组合谓词 NSPredicate *pred1 = [NSpredicate ...]; NSPredicate *pred2 = [NSpredicate ...]; NSPredicate *pred
NSPredicate *pred1 = [NSpredicate ...];
NSPredicate *pred2 = [NSpredicate ...];
NSPredicate *pred3 = [NSpredicate ...];
我从服务器字符串中了解了我需要如何组合谓词
NSPredicate *pred1 = [NSpredicate ...];
NSPredicate *pred2 = [NSpredicate ...];
NSPredicate *pred3 = [NSpredicate ...];
比如说
(1 OR 2 OR 3)
(1 OR 3) AND 2
3 OR (1 AND 2)
我如何在正确的条件和括号中组合我的三个谓词
谢谢您总是可以像这样创建嵌套的
NSCompoundPredicate
NSPredicate *orPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[firstPredicate, secondPredicate]];
NSPredicate *andPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[thirdPredicate, fourthPredicate]];
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[orPredicate, andPredicate]];
您可以使用此代码,例如:
NSPredicate *p1 = [NSPredicate ];
NSPredicate *p2 = [NSPredicate "];
NSPredicate *p3 = [NSPredicate "];
在最后的谓语中
NSPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2,p3]];
这项工作类似于(p1、p2和p3)
您还可以使用OrPredicateWithSubPredicate,而不是PredicateWithSubPredicate WithNSCompoundPredicate一种方法是从谓词生成“真值表输入”,基于字符串生成组合谓词,并使用真值表数据对其求值
NSPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[p1, p2,p3]];
为了让谓词处理真值表,您需要将(1或2)和3
转换为(SELF[1]==YES或SELF[2]==YES)和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处,因为替换字符串使用基于一的索引
现在,您可以使用前面准备的谓词了:
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,每次我可以有不同的字符串。我不能有三个,比如十个(1或2和(3或4)和(5或6)以及7和8和10),你可以把不在大括号内的组合起来,对吗?像这样:(2和7,8和10,(3或4)和(5或6)或1)。现在您可以创建如下谓词:NSPredicate*和predicate=[NSCompoundPredicate和predicatewithsubpredicates:@[2,7,8,10]代码>等等…对不起,我不明白NSPredicate*pred=[NSPredicate PREDITEWITHFORMAT:subst];NSPredicate pred=[NSPredicate PREDITEWITHFORMAT:subst];NSMutableArray*resultArray=[NSMutableArray新建];[resultArray addObject:@(否)];NSPredicate*currentPred1=*;NSPredicate*currentPred2=*;NSPredicate*currentPred3=];NSArray*arrayPredicates=@[currentPred1,currentPred2,currentPred3];对于(int i=0;i[resultArray addObject:@([arrayPredicates[i]evaluateWithObject:someObject])
,其中someObject
是传递给pred1
进行求值的对象。predN。同样,循环的需要i
,而不仅仅是i
Саа,СПаббабаааааа!Попробовал вас найти, хотел с вами связаться, по почте например, но не получилось.