以下代码提出了一个问题
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
为什么会这样?
答案 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