如何使用 UISearchBar 过滤 NSDictionary?

How do I filter NSDictionary with UISearchBar?

我需要更改我的搜索功能以过滤数组:

func filterContentForSearchText(searchText: String, scope: String = "All") {
    if searchText != "" {

        filteredName = CGCoins.shared.ids.filter {name in
            return   name.lowercased().contains(searchText.lowercased())}
    } else { filteredName = CGCoins.shared.ids

    }
}

过滤包含符号及其对应名称的字典。理想情况下,我希望能够同时搜索键和值,例如字典,(CGCoins.shared.coinDictionary) 看起来像这样:

["btc":"bitcoin","eth":"ethereum","ltc":"litecoin"...]

所以我希望能够使用 UISearchBar 进行搜索,并且能够同时搜索 "btc" 和 return "bitcoin" 或搜索 "bitcoin" 和还有 return "bitcoin".

我试过这个:

func filterNewForSearchText(searchText: String, scope: String = "All") {
    if searchText != "" {

        filteredName = CGCoins.shared.coinDictionary.filter {name in
            return   name.key == searchText}
    } else { filteredName = CGCoins.shared.coinDictionary.values

    }
}

但我收到错误:

Cannot assign value of type '[String : String]' to type '[String]'

我如何才能成功过滤字典的键和值,以及 return 所搜索内容的值?也欢迎任何替代解决方案。

过滤字典 return您需要映射结果和 return 字典值的元组。在其他部分,您需要根据其值创建一个新数组:

func filterNewForSearchText(searchText: String, scope: String = "All") {
    if !searchText.isEmpty  {
        filteredName = CGCoins.shared.coinDictionary
                           .filter { 
                               [=10=].key == searchText 

                            // if you need to search key and value and include partial matches
                            // [=10=].key.contains(searchText) || [=10=].value.contains(searchText)

                            // if you need to search caseInsensitively key and value and include partial matches
                            // [=10=].key.range(of: searchText, options: .caseInsensitive) != nil || [=10=].value.range(of: searchText, options: .caseInsensitive) != nil
                            }
                           .map{ [=10=].value }
    } else {
        filteredName = Array(CGCoins.shared.coinDictionary.values)
    }
}

错误消息是因为过滤字典不会自动 return 它的值,但你必须 获取 它的键然后换行它们在数组中:

以下查找键中的完全匹配项,或者 searchText 是否包含在值中:

if searchText != "" {
    filteredName = Array(CGCoins.shared.coinDictionary.filter {name in
        return name.key == searchText || name.value.lowercased().contains(searchText.lowercased())
        }.values)
} else {
    filteredName = Array(CGCoins.shared.coinDictionary.values)
}

试试这个很管用

For Like Query(字符串包含另一个字符串)

let data = ["btc":"bitcoin","eth":"ethereum","ltc":"litecoin"]

let filtered = data.filter { [=10=].key.contains("c") || [=10=].value.contains("c") }
print(filtered) // ["btc":"bitcoin","ltc":"litecoin"]

对于精确匹配字符串

let filtered = data.filter { [=11=].key == "btc"  || [=11=].value == "litecoin" }