我在 firestore
中拥有cities: [String]
的结构
struct CityList {
var country: String
var cities: [String]
}
firestore中的结构看起来像
1
country: Russia
cities: ["Moscow", "Saint-Petersburg"]
2
country: USA
cities: ["New York", "Los Angeles"]
使用searchController时,我需要使用字符串cities: [String]
的过滤器数组。现在我有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仅搜索第一个城市为莫斯科或纽约。
如何搜索莫斯科,圣彼得堡,纽约和洛杉矶?
答案 0 :(得分:3)
因此,您的城市[0]仅排在第一个城市,我假设您需要在所有城市中进行搜索,所以我会检查cities.contains
。我也将使用localizedCaseInsensitiveContains而不是手动降低外壳大小。
cities.contains {
$0.localizedCaseInsensitiveContains(searchText)
}
过滤器为:
cityList.filter { list in
list.cities.contains { city in
city.localizedCaseInsensitiveContains(searchText)
}
}
答案 1 :(得分:0)
let arrayFiltered = CityList.cities.filter{
$0.lowercased().contains(searchText.lowercased())
}
请尝试这个。
答案 2 :(得分:0)
您尝试对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