Фильтрация 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]];