這只是一個部分的答案,但也許它有助於把你放在正確的道路上。
首先,通過[NSExpression expressionForKeyPath:@"$my_var.test"]
代$my_var
不起作用,因爲後者表達對待$my_var
爲純鍵,而不是作爲 一個變量。
但是你可以通過另一個變量替換一個變量,使用expressionForVariable
:
NSPredicate * myPred = [NSPredicate predicateWithFormat:@"[email protected] == 3"];
NSExpression * myExpr = [NSExpression expressionForVariable:@"another_var"] ;
NSPredicate * myPredBis = [myPred predicateWithSubstitutionVariables:@{@"my_var" : myExpr}] ;
其次,[NSExpression expressionForKeyPath:@"self"]
對待「自我」作爲一個普通的鑰匙,而不是「」自我,即對象在其上謂詞被應用。您可能需要 :
NSExpression * myExpr2 = [NSExpression expressionForEvaluatedObject];
改爲。現在,您可以鏈中的替代:
NSPredicate * myFinalPred = [myPredBis predicateWithSubstitutionVariables:@{@"another_var": myExpr2}];
NSLog(@"%@", myFinalPred);
輸出:[email protected] == 3
(「自我」的部分是不打印)。
好的,這是您的問題的解決方案。棘手的部分是第二步。 我沒有找到直接的方法來建立一個鍵路徑表達式,該表達式由一個 變量($my_var
)和一個普通鍵(test
)組成。但是可以通過取謂詞的左手邊來完成 :
NSPredicate * myPred = [NSPredicate predicateWithFormat:@"[email protected] == 3"];
NSLog(@"%@", myPred) ;
// [email protected] == 3
NSExpression *myExpr = [(NSComparisonPredicate *)[NSPredicate predicateWithFormat:@"$my_var.test == 0"] leftExpression];
NSPredicate * myPredBis = [myPred predicateWithSubstitutionVariables:@{@"my_var" : myExpr}] ;
NSLog(@"%@", myPredBis) ;
// [email protected] == 3
NSExpression * myExpr2 = [NSExpression expressionForEvaluatedObject];
NSPredicate * myFinalPred = [myPredBis predicateWithSubstitutionVariables:@{@"my_var": myExpr2}];
NSLog(@"%@", myFinalPred) ;
// [email protected] == 3
你怎麼知道這個類很好?我注意到文檔,他們不談論這個,是嗎?所以現在,我只需要了解如何創建一個NSExpression'$ var.key.path',其中'$ key'被理解爲一個變量。感謝@馬丁! – Colas
@Colas:查看更新後的答案。 –
哇,這是一個不錯的訣竅! – Colas