Использование NSPredicate для фильтрации NSArray на основе ключей NSDictionary

У меня есть набор словарей.

Я хочу фильтровать массив на основе ключа.

Я попробовал это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == %@)", @"Football"]; NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate]; 

Это не работает, я не получаю никаких результатов. Я думаю, что я делаю что-то неправильно. Я знаю, что это метод, если «СПОРТ» был иваром. Я думаю, что это, вероятно, другое, если это ключ.

Однако я не смог найти пример.

благодаря


Обновить

Я добавил цитаты вокруг строки, которую я ищу.

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == '%@')", @"Football"]; 

Это все еще не работает.


Обновление 2

Решил. Мне действительно пришлось удалить одиночные кавычки, которые, похоже, противоречат тому, что говорит гид.

Моя реальная проблема в том, что у меня был вложенный массив, и я фактически не оценивал словари. Голова головы кости.

6 Solutions collect form web for “Использование NSPredicate для фильтрации NSArray на основе ключей NSDictionary”

Он должен работать – до тех пор, пока переменная данных на самом деле представляет собой массив, содержащий словарь с ключом SPORT

 NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]]; NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]]; 

Фильтрация в этом случае содержит словарь.

(% @ не нужно указывать, это делается, когда NSPredicate создает объект.)

Я знаю, что это старые новости, но добавить мои два цента. По умолчанию я использую команды LIKE[cd] а не только [c] . [d] сравнивает буквы с символами акцента. Это особенно хорошо работает в моем приложении Warcraft, где люди называют свое имя «Vòódòó», что делает невозможным поиск их имени в виде таблицы. [d] разбивает свои символы акцента во время предиката. Итак, предикат @"name LIKE[CD] %@", object.name где object.name == @"voodoo" вернет объект, содержащий имя Vòódòó.

Из документации Apple: например, [cd] означает «case-and diacritic-insensitive like.»). Полное описание синтаксиса строк и список всех доступных операторов см. В разделе Синтаксис строкового формата Predicate Format .

 #import  // clang -framework Foundation Siegfried.m int main() { NSArray *arr = @[ @{@"1" : @"Fafner"}, @{@"1" : @"Fasolt"} ]; NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"]; NSArray *res = [arr filteredArrayUsingPredicate:p]; NSLog(@"Siegfried %@", res); return 0; } 

NSPredicate доступен только в iPhone 3.0.

Вы не заметите этого, пока не попытаетесь запустить устройство.

С Swift 3, когда вы хотите отфильтровать массив словарей с предикатом, основанным на словарных клавишах и значениях, вы можете выбрать один из следующих шаблонов.


# 1. Использование init(format:arguments:) NSPredicate init(format:arguments:)

Если вы пришли из Objective-C, init(format:arguments:) предлагает стиль кодирования ключевого значения для оценки вашего предиката.

Применение:

 import Foundation let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]] let predicate = NSPredicate(format: "key1 == %@", "value1") //let predicate = NSPredicate(format: "self['key1'] == %@", "value1") // also works let filteredArray = array.filter(predicate.evaluate) print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]] 

# 2. Использование NSPredicate init(block:) NSPredicate init(block:)

В качестве альтернативы, если вы предпочитаете строго типизированные API-интерфейсы поверх строго типизированных API-интерфейсов, вы можете использовать init(block:) .

Применение:

 import Foundation let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]] let dictPredicate = NSPredicate(block: { (obj, _) in guard let dict = obj as? [String: String], let value = dict["key1"] else { return false } return value == "value1" }) let filteredArray = array.filter(dictPredicate.evaluate) print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]] 

Если посмотреть на ссылку NSPredicate , похоже, вам нужно окружить свой символ замещения кавычками. Например, ваш текущий предикат читает: (SPORT == Football) Вы хотите его прочитать (SPORT == 'Football') , поэтому ваша строка формата должна быть @"(SPORT == '%@')" .

  • Статические и нестатические члены classа
  • Как вызвать метод Objective C из Javascript и отправить данные в Javascript в iOS?
  • Как преобразовать имя переменной (object) в String
  • Как получить доступ к первому свойству объекта в Javascript?
  • NSArray от NSCharacterSet
  • NSDate получить год / месяц / день
  • Интервью: Можем ли мы создать абстрактный class?
  • Как обновить «массив объектов» с помощью Firestore?
  • Как сериализовать объект в формате строки запроса?
  • Все в .NET является объектом?
  • Получение ключей NSDictionary, отсортированных по их соответствующим значениям
  • Interesting Posts

    утечка памяти? почему java.lang.ref.Finalizer есть столько памяти

    Создайте загрузочный USB-накопитель из DMG-файла в Windows

    Как скрыть результаты формулы до тех пор, пока не будут выполнены условия

    Редактор с использованием muti-line поиска и замены

    Трассировка стека или дополнительная информация о необработанном исключении в Xcode / iPhone

    Назначить инициированный код нескольким изображениям – Excel VBA

    Извлекать сообщения из файлов OST / PST?

    Должен ли я использовать data.frame или матрицу?

    Повторение случайных величин в VBA

    Как использовать Rundll32 для выполнения DLL-функции?

    Как проверить размер RAM, не глядя на материнскую плату

    ORA-01461: может связывать значение LONG только для вставки в столбцы LONG. Происходит при запросе

    Некоторые системные файлы Windows не могут быть удалены

    Как я могу всегда запускать командную строку как администратор?

    Как XML-сериализовать словарь

    Давайте будем гением компьютера.