使用小写字母和数组过滤搜索文本的内容

时间:2018-12-27 10:30:15

标签: ios swift xcode filter

我在 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仅搜索第一个城市为莫斯科纽约

如何搜索莫斯科,圣彼得堡,纽约和洛杉矶

3 个答案:

答案 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