链接替换在NSPredicate中不起作用

时间:2014-02-17 07:42:09

标签: cocoa nspredicate

以下代码提出了一个问题

NSPredicate * myPred = [NSPredicate predicateWithFormat:@"$my_var.employees.@count == 3"];

NSExpression * myExpr = [NSExpression    expressionForKeyPath:@"$my_var.test"] ;

 NSPredicate * myPredBis = [myPred predicateWithSubstitutionVariables:@{@"my_var" : myExpr}] ;



NSExpression * myExpr2 = [NSExpression    expressionForKeyPath:@"self"] ;

NSPredicate * myFinalPred = [myPredBis predicateWithSubstitutionVariables:@{@"my_var": myExpr2}];

NSLog(@"%@", myFinalPred) ;

打印

$my_var.test.employees.@count == 3

但我们想要

self.test.employees.@count == 3

为什么会这样?

1 个答案:

答案 0 :(得分:1)

这只是一个部分答案,但也许有助于让你走上正确的道路。

首先,用$my_var替换[NSExpression expressionForKeyPath:@"$my_var.test"] 不起作用,因为后一个表达式将$my_var视为普通键,而不是 变量。

但您可以使用expressionForVariable

将另一个变量替换为另一个变量
NSPredicate * myPred = [NSPredicate predicateWithFormat:@"$my_var.employees.@count == 3"];
NSExpression * myExpr = [NSExpression expressionForVariable:@"another_var"] ;
NSPredicate * myPredBis = [myPred predicateWithSubstitutionVariables:@{@"my_var" : myExpr}] ;

其次,[NSExpression expressionForKeyPath:@"self"]将“self”视为普通键,而不是“the self ,即应用谓词的对象。你可能 想:

NSExpression * myExpr2 = [NSExpression expressionForEvaluatedObject];

代替。现在你可以链接替换:

NSPredicate * myFinalPred = [myPredBis predicateWithSubstitutionVariables:@{@"another_var": myExpr2}];
NSLog(@"%@", myFinalPred);

输出:employees.@count == 3(“自我”部分不打印)。


好的,这是解决您问题的方法。棘手的部分是第二步。 我没有找到一种直接的方法来构建一个由a组成的键路径表达式 变量($my_var)与普通密钥(test)相结合。但这是可以完成的 通过采用谓词的左侧:

NSPredicate * myPred = [NSPredicate predicateWithFormat:@"$my_var.employees.@count == 3"];
NSLog(@"%@", myPred) ;
// $my_var.employees.@count == 3            

NSExpression *myExpr = [(NSComparisonPredicate *)[NSPredicate predicateWithFormat:@"$my_var.test == 0"] leftExpression];
NSPredicate * myPredBis = [myPred predicateWithSubstitutionVariables:@{@"my_var" : myExpr}] ;
NSLog(@"%@", myPredBis) ; 
// $my_var.test.employees.@count == 3           

NSExpression * myExpr2 = [NSExpression expressionForEvaluatedObject];
NSPredicate * myFinalPred = [myPredBis predicateWithSubstitutionVariables:@{@"my_var": myExpr2}];
NSLog(@"%@", myFinalPred) ;            
// test.employees.@count == 3