Панель поиска массива словарей Swift - PullRequest
0 голосов
/ 23 апреля 2020

У меня ситуация, когда я застрял. Проще говоря, моя задача - проанализировать JSON (например) для UITableView и отфильтровать его через собственный SearchBar.

JSON выглядит так:

{
   "title":"Two",
   "image":"Two.png"

    }

... et c

После анализа я получаю массив словарей, который выглядит следующим образом (разложен для более глубокого понимания)

imagesArray = [["title":"Two", "image":"Two.png"],["title":"Three Four", "image":"ThreeFour.png"],["title":"Five", "image":"Five.png"]]

Я должен фильтровать, используя имя "title". Хотя я и не могу понять, как использовать встроенную фильтрацию SearchBar через Array of Dicts, но я знаю, что есть способы.

Или, если моя концепция парсинга в Array of Dicts неверна можете исправить меня и показать любой из различных методов: (

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020
func searchFor(_ chars: String) -> [[String : String]] {
    return imagesArray.filter { ($0["title"]?.range(of: chars, options: .caseInsensitive) != nil) }
}


print(searchFor("th")) // [["title": "Three Four", "image": "ThreeFour.png"]]
0 голосов
/ 23 апреля 2020

Вы можете разобрать JSON в массив dicts, однако я бы порекомендовал разобрать данные в массив кодируемых структур или классов, например, так.

let json = """
[
{
"title":"Two",
"image":"Two.png"

}
]
"""

struct Item: Codable {
    var title, image: String
}

if let jsonData = json.data(using: .utf8) {
    do {
        var items = try JSONDecoder().decode([Item].self, from: jsonData)

    } catch {
        print("Error: " + error.localizedDescription)
    }
}

class del: NSObject,UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    }
}

Как только вы получите массив объекты вы можете отфильтровать их в новый массив, который вы используете в качестве данных для UITableView в методе textDidChange UISearchBarDelegate, как это.

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    let filteredItems = items.filter { (item) in
        item.title
            .lowercased()
            .contains(searchText.lowercased())
    }
}

Надеюсь, это поможет.

...