Как предикировать объекты внутри массива по object.name - PullRequest
0 голосов
/ 04 октября 2019

У меня есть объект Dog с переменной

name: String, age: Int

У меня есть [Dog] с 5 собаками там

Я хотел бы указать для поискастрока, в которой dog.name содержит введенное значение

Код, приведенный ниже, не выполнен, ошибка говорит: «нет имени ключа»

 let searchPredicate = NSPredicate(format: "SELF Any.name CONTAINS[c] %@", text)
    let array = (data as NSArray).filtered(using: searchPredicate)
    let productSearchResults = array

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Вам не нужен NSPredicate, вы можете использовать фильтр непосредственно в вашем массиве

let productSearchResults = array.filter { $0.name.contains(text) }

Но если вы действительно хотите использовать NSPredicate, попробуйте:

NSPredicate(format: "ANY name contains[c] %@", text)
0 голосов
/ 04 октября 2019

попробуйте использовать filter функцию

 let filterArray = dogArray.filter { $0.name.lowercased().contains(searchText.lowercased()) }
0 голосов
/ 04 октября 2019

Как уже упоминалось @Larme в комментариях, вам следует рассмотреть возможность использования Swifts Array.filter().

Однако, если вы хотите или должны по какой-то причине использовать NSPredicate, вы можете сделать это также. Обратите внимание, что предикат используется для проверки каждого элемента в массиве. Поэтому keyPath, используемые в предикате, должны быть заданы относительно элемента.

Следовательно, предикат должен быть: let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", text)

...