Фильтрация NSArray объектов NSDictionary с использованием NSPredicate

У меня есть NSArray объектов NSDictionary. Я хочу фильтровать массив на основе ключей словарей, используя NSPredicate. Я делал что-то вроде этого:

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate];

Это отлично работает, если ключ передается в одно слово: цвет, имя, возраст. Но это не работает, если ключ является многословным, например: Person Age, Person Name.

В принципе, любой ключ, содержащий пробел, не работает. Я пробовал помещать одинарные кавычки вокруг ключа в строке, точно так же, как они сделаны на стороне ценности, но это тоже не сработало. Также судимые двойные кавычки, но безрезультатно.

Пожалуйста, сообщите об этом. Спасибо заранее.

Ответ 1

При использовании динамического ключа вместо %@ следует использовать токен %K. Вы также не хотите котировки вокруг токена значения. Они заставят ваш предикат протестировать равенство против литеральной строки @"%@" вместо value.

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value];

Это описано в Руководство по синтаксису строкового формата предикатов.


Изменить: Как указывает Анум Амин, +[NSString stringWithFormat:] не обрабатывает предикатные форматы. Вместо этого вы хотите [NSPredicate predicateWithFormat:@"%K == %@", key, value].

Ответ 2

Для меня ответ Кевина не работал. Я использовал:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself
        NSLog(@"predicate %@",predicateString);
        filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]];