如何使用 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" }
我需要更改我的搜索功能以过滤数组:
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" }