У меня есть множество словарей.
Я хочу отфильтровать массив по ключу.
Я пробовал это:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == %@)", @"Football"];
NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];
Это не работает, я не получаю результатов. Я думаю, что я что-то не так делаю. Я знаю, что это метод, если "СПОРТ" был иваром. Думаю, наверное, другое, если это ключ.
Однако мне не удалось найти пример.
Спасибо
Обновить
Я добавил кавычки вокруг строки, которую ищу.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == '%@')", @"Football"];
Это все еще не работает.
Обновление 2
Решил это. Мне действительно пришлось удалить одинарные кавычки, что, похоже, противоречит тому, что говорит руководство.
Моя настоящая проблема в том, что у меня был вложенный массив, и я фактически не оценивал словари. Костная голова двигается.
objective-c
cocoa
nsarray
nsdictionary
nspredicate
Кори Флойд
источник
источник
Ответы:
Он должен работать - пока переменная данных на самом деле является массивом, содержащим словарь с ключом SPORT
Фильтруемый в данном случае содержит словарь.
(% @ не обязательно заключать в кавычки, это делается, когда NSPredicate создает объект.)
источник
Я знаю, что это старые новости, но добавлю два цента. По умолчанию я использую команды,
LIKE[cd]
а не просто[c]
.[d]
Сравнивает буквы с диакритическими символами. Это особенно хорошо работает в моем приложении Warcraft, где люди пишут свое имя «Vòódòó», что делает практически невозможным поиск их имени в табличном представлении.[d]
Полосы их символы ударения во предикате. Таким образом, предикат@"name LIKE[CD] %@", object.name
whereobject.name == @"voodoo"
вернет объект, содержащий имя Vòódòó.Из документации Apple: like [cd] означает «подобный без учета регистра и диакритических знаков»). Полное описание синтаксиса строки и список всех доступных операторов см. В разделе Синтаксис строки формата предиката .
источник
источник
NSPredicate
доступно только в iPhone 3.0.Вы не заметите этого, пока не попытаетесь запустить на устройстве.
источник
В Swift 3, когда вы хотите отфильтровать массив словарей с помощью предиката, основанного на словарных ключах и значениях, вы можете выбрать один из следующих шаблонов.
№1. Использование
NSPredicate
init(format:arguments:)
инициализатораЕсли вы пришли из Objective-C,
init(format:arguments:)
предлагает стиль кодирования "ключ-значение" для оценки вашего предиката.Использование:
№2. Использование
NSPredicate
init(block:)
инициализатораВ качестве альтернативы, если вы предпочитаете строго типизированные API, а не строго типизированные API, вы можете использовать
init(block:)
инициализатор.Использование:
источник
Глядя на ссылку NSPredicate , похоже, что вам нужно заключить символ подстановки в кавычки. Например, ваш текущий предикат гласит:
(SPORT == Football)
вы хотите, чтобы он читался(SPORT == 'Football')
, поэтому ваша строка формата должна быть@"(SPORT == '%@')"
.источник