Поиск из массива с настраиваемыми полями Swift - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть массивы

var searchArray = [(
    ean: String,
    name: String,
    weight: String,
    brand: String,
    percent: String,
    inside: String,
    img: String,
    packet: String,
    date: String)
    ]()

var searchArrayFiltered = [(
    ean: String,
    name: String,
    weight: String,
    brand: String,
    percent: String,
    inside: String,
    img: String,
    packet: String,
    date: String)
    ]()

У меня есть код для поиска по массивам и показать результат в таблице:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    searchArrayFiltered = searchText.isEmpty ? searchArray : searchArray.filter({(dataString: String) -> Bool in
        return dataString.(of: searchText, options: .caseInsensitive) != nil
    })

    tableView.reloadData()
}

Но в строке return dataString.String(of: searchText, options: .caseInsensitive) != nil у меня есть ошибка:

Значение типа кортежа '(например: строка, имя: строка, вес: строка, марка: строка, процент: строка, внутри: строка, img: строка, пакет: строка, дата: строка) 'не имеет члена' String '

Если я изменяю dataString.String на dataString.name, у меня появляется ошибка:

Невозможно вызвать значение нефункционального типа'String'

Пожалуйста, помогите мне выполнить поиск по searchArray для "name" .

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

создать структуру для

struct Model {
    var ean: String
    var name: String
    var weight: String
    var brand: String
    var percent: String
    var inside: String
    var img: String
    var packet: String
    var date: String
}

затем примените фильтр к вашему [Model]

0 голосов
/ 13 ноября 2018

Прежде всего, вам не рекомендуется использовать кортеж в качестве типа массива. Используйте пользовательскую структуру или класс

Apple говорит:

Кортежи полезны для временных групп связанных значений. Они не подходят для создания сложных структур данных. Если ваша структура данных может остаться за пределами временной области, смоделируйте ее как класс или структуру, а не как кортеж.


Есть две основные проблемы:

  1. Ошибка копирования и вставки, вы имеете в виду dataString.range(of...
  2. dataString это не строка, это кортеж (аннотация типа избыточна)

Измените функцию на

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    searchArrayFiltered = searchText.isEmpty ? searchArray : searchArray.filter({tuple -> Bool in
        return tuple.name.range(of: searchText, options: .caseInsensitive) != nil
    })

    tableView.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...