Фильтр содержимого для поиска текста с использованием нижнего регистра и массива - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть структура с cities: [String] в firestore

struct CityList {
    var country: String
    var cities: [String]
}

Структура в firestore выглядит как на

1
    country: Russia
    cities: ["Moscow", "Saint-Petersburg"]
2
    country: USA
    cities: ["New York", "Los Angeles"]

Мне нужно использовать массив строк фильтраcities: [String] когда я использую searchController.Теперь у меня есть func filterContentForSearchText

private func filterContentForSearchText(_ searchText: String) {
    filteredCityList = cityList.filter({ (cityList: CityList) -> Bool in
        return cityList.cities[0].lowercased().contains(searchText.lowercased())
    })
    tableView.reloadData()
}

Я знаю, с моей ошибкой -> cities[0], но я не понимаю, как это исправить ...

И когда я пишутекст в searchController, searchController поиск только первый город это Москва или Нью-Йорк .

Как мне искать Москва, Санкт-Петербург, Нью-Йорк и Лос-Анджелес ?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Так что ваши города [0] занимают только первый город, я предполагаю, что вам нужно искать во всех городах, поэтому я бы проверил cities.contains.Я бы также использовал localizedCaseInsensitiveContains вместо того, чтобы вручную нижний регистр.

cities.contains {
    $0.localizedCaseInsensitiveContains(searchText)
}

фильтр будет:

cityList.filter { list in
    list.cities.contains { city in
        city.localizedCaseInsensitiveContains(searchText)
    }
}
0 голосов
/ 27 декабря 2018

Вы пытаетесь фильтровать по Struct, это не сработает.Попробуйте вместо этого использовать фильтр на Массив городов.


Я думаю, что ваша структура данных может быть улучшена следующим образом:

let searchText = "Moscow"

 // for easch Country: Cities array
let worldCities: [String: [String]] = [ "Russia": ["Moscow", "Saint-Petersburg"],
                                        "USA": ["New York", "Los Angeles"]
                                        ]


let result = worldCities["Russia"]?.filter({ city -> Bool in
    if city.lowercased().contains(searchText.lowercased()) {
        return true
    } else {
        return false
    }
})

Если вы хотите перейти по всем странам, вам, вероятно, следует использовать один массив всех городов или объединить сПример выше:

let all = worldCities.values
0 голосов
/ 27 декабря 2018
let arrayFiltered = CityList.cities.filter{
       $0.lowercased().contains(searchText.lowercased())
}

Пожалуйста, попробуйте это.

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