Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 复合预测_Ios_Objective C_Core Data_Nspredicate - Fatal编程技术网

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
Саа,СПаббабаааааа!Попробовал вас найти, хотел с вами связаться, по почте например, но не получилось.