2014-02-17 44 views
0

下面的代碼提出了一個問題鏈接替換不工作在NSPredicate

NSPredicate * myPred = [NSPredicate predicateWithFormat:@"[email protected] == 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) ; 

它打印

[email protected] == 3 

但我們想

[email protected] == 3 

爲什麼會出現這種情況?

回答

1

這只是一個部分的答案,但也許它有助於把你放在正確的道路上。

首先,通過[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 
+0

你怎麼知道這個類很好?我注意到文檔,他們不談論這個,是嗎?所以現在,我只需要了解如何創建一個NSExpression'$ var.key.path',其中'$ key'被理解爲一個變量。感謝@馬丁! – Colas

+1

@Colas:查看更新後的答案。 –

+0

哇,這是一個不錯的訣竅! – Colas