Предикат NSPredicateWithFormat: (NSString *) несоответствие? - PullRequest
7 голосов
/ 18 июля 2011

Работая над фильтрацией моего NSMutableDictionary на основе пользовательского ввода, я создал следующий код:

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

"searchString" передается в метод с таким определением:

(NSString*) searchString

Это, однако, привело к следующему исключению:

... повышенный [valueForUndefinedKey:]: этот класс не соответствует значению ключа для ключа ...

Исправление оказалось:

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

Что я не понимаю, так это то, почему последний сработал, а первый бросил исключение. Я немного прочитал о кодировании значения ключа , но я не понимаю, как это применимо здесь. (т. е. только путем изменения определения NSP-предиката) Может ли кто-нибудь просветить меня?

Обновление: В ответ на комментарий jtbandes я продолжил работу и создал проект TestApp для демонстрации этой проблемы. http://dl.dropbox.com/u/401317/TestApp1.tar.gz

1 Ответ

17 голосов
/ 18 июля 2011

Ответ - в руководстве по программированию предикатов .

Строковые константы должны быть заключены в кавычки - допускаются одинарные и двойные кавычки, ... Если вы используете подстановку переменных с использованием% @ ..., кавычки добавляются автоматически .Если вы используете строковые константы в вашей строке формата, вы должны сами заключить их в кавычки

[мой акцент]

predicateWithFormat вставит для вас кавычкино stringWithFormat нет.Ваш первый пример, вероятно, сработает, если вы сделаете это:

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] '%@'", searchString];
//                                                                           ^  ^ single or double quotes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...