2011-07-17 12 views
7

Pracując na filtrowanie mój NSMutableDictionary na podstawie danych wprowadzonych przez użytkownika, stworzyłem następujący kod:NSPredicate predicateWithFormat: (NSString *) niespójność?

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

„searchString” jest przekazywany do metody z tej definicji:

(NSString*) searchString 

To jednak spowodowało w następujący wyjątek:

... podniesiona [valueForUndefinedKey:]: ta klasa jest wartość nie klucz kodowania zgodny dla ke y ...

Rozwiązaniem okazały się:

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

Co ja nie rozumiem, dlaczego ten ostatni pracował, a Byłą zwrócił wyjątek. Czytałem trochę na temat key value coding, ale nie rozumiem, w jaki sposób ma to zastosowanie. (tj. tylko zmieniając sposób definiowania NSPredicate) Czy ktoś może mnie oświecić?

Aktualizacja: W odpowiedzi na jtbandes komentarz, poszedł do przodu i stworzyli projekt testapp demo tego problemu. http://dl.dropbox.com/u/401317/TestApp1.tar.gz

+0

Będziesz naprawdę musiał pokazać nam cały wyjątek, jeśli spodziewasz się, że zrozumiemy, co to znaczy. – jtbandes

Odpowiedz

17

Odpowiedź brzmi: in the predicate programming guide.

Stałe łańcuchowe muszą zostać podane w ciągu wyrażenie-pojedyncze i podwójne cudzysłowy są zarówno dopuszczalne, ... Jeśli używasz podstawienia zmiennej używając% @ ..., cudzysłowy są automatycznie dodana dla Ciebie. Jeśli używasz stałe ciągów znaków w swoim formacie łańcucha, należy je cytować siebie

[podkreślenie moje]

predicateWithFormat stawia cytaty dla Ciebie, ale stringWithFormat nie. Twój pierwszy przykład prawdopodobnie działałby, gdybyś to zrobił:

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

Rzeczywiście, cytaty rozwiązują problem. Rzucanie wyjątku "valueForUndefinedKey" wydaje się tylko prowadzić dewelopera w dół zła ścieżka, jak sądzę. (Niepoprawna składnia predykatów byłaby lepsza, myślę) Może to tylko mój brak doświadczenia z celem c. – yanigisawa

+0

@yanigisawa: nie jest to jednak nieprawidłowa składnia. Jeśli nie ma żadnych cudzysłowów, zakłada się, że jest to klucz KVC, więc porównujesz wartość jednego klucza z drugim. W tych okolicznościach wyjątek ma sens. – JeremyP

+0

Dobrze, przypiszę to do mojego niedoświadczenia z powodu błędów kompilatora i środowiska wykonawczego. Dzięki za pomoc. – yanigisawa

Powiązane problemy