2011-07-17 99 views
7

雖然基於用戶輸入過濾我的NSMutableDictionary工作,我創建了下面的代碼:NSPredicate predicateWithFormat:(NSString *)不一致?

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] %@", searchString]; 
NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 

「搜索字符串」傳遞到這個定義的方法:

(NSString*) searchString 

然而,這導致以下例外情況如下:

... raise [valueForUndefinedKey:]:該類別爲 對於ke不符合密鑰值Y ...

的修復竟然是:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF beginsWith[cd] %@", searchString]; 
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 

我不明白,這就是爲什麼後者的工作,和前拋出異常。我已閱讀key value coding一點點,但我不明白它在這裏如何適用。 (即只是通過改變NSPredicate的定義)有人能夠啓發我嗎?

更新: 爲了迴應jtbandes評論,我繼續創建了一個TestApp項目來演示此問題。 http://dl.dropbox.com/u/401317/TestApp1.tar.gz

+0

如果你希望我們弄清楚它的含義,你將不得不向我們展示整個異常。 – jtbandes

回答

17

答案是in the predicate programming guide

字符串常量必須表達單引號和雙引號內引用都是可以接受的,...... 如果使用變量替換使用%@ ...,引號都自動爲您添加。如果您使用格式字符串中的字符串常量,必須引用他們自己

[我的重點]

predicateWithFormat放入你的報價,但stringWithFormat沒有。你的第一個例子可能會工作,如果你這樣做:

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] '%@'", searchString]; 
//                   ^^ single or double quotes 
+0

確實,引號解決了這個問題。拋出一個「valueForUndefinedKey」異常就好像把開發人員引向錯誤的路徑。 (無效的謂詞語法會更好,我認爲)也許這只是我對objective-c的缺乏經驗。 – yanigisawa

+0

@yanigisawa:雖然它不是無效的語法。如果沒有引號,則認爲它是KVC密鑰,因此您將一個密鑰的值與另一個密鑰的值進行比較。在這種情況下,這種例外是有道理的。 – JeremyP

+0

好的,我會把它記下來,因爲我對這些編譯器和運行時錯誤沒有經驗。謝謝你的幫助。 – yanigisawa