Swift 实现字典内搜索的搜索结果?
我有一本字典,像Swift 实现字典内搜索的搜索结果?,swift,nsdictionary,uisearchbar,Swift,Nsdictionary,Uisearchbar,我有一本字典,像 var DataDict:[String:[String]] = [String:[String]]() DataDict[“fruits”] = [“apple”,”orange”,”pineapple”,”grape”] DataDict[“vehicle”] = [“car”,”cycle / scooter“,”bike”] DataDict[“colours”] = [“black”,”white”,”yellow”,”green”,”blue”] 因此,当我在搜
var DataDict:[String:[String]] = [String:[String]]()
DataDict[“fruits”] = [“apple”,”orange”,”pineapple”,”grape”]
DataDict[“vehicle”] = [“car”,”cycle / scooter“,”bike”]
DataDict[“colours”] = [“black”,”white”,”yellow”,”green”,”blue”]
因此,当我在搜索栏中搜索时,如果searchText
是fruits,那么tableview
应该显示完整的fruits数组,或者是与DataDict每个键内的单个对象相匹配的任何搜索文本
那么,我将如何实现这一点来显示表视图
。我需要在searchBar
textDidChange委托中实现这一点
最后,我需要将结果显示为,DataDict
对象作为标题,其相应的键
作为副标题
例:
创建空数组并初始化它将是DataDict的第一个键,并使其成为tableView的数据源
然后,每次搜索都会将其内容替换为与搜索匹配的新内容,并重新加载tableView创建空数组并初始化它,然后将DataDict的第一个键设置为tableView的数据源 然后每次搜索都将其内容替换为与搜索匹配的新内容,然后重新加载tableView您可以这样做
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle / scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
let filterarray = Array(DataDict.keys).filter { $0.contains("searchText")}
print("\(filterarray)")
for string in filterarray {
print("\(DataDict[string]!)")
}
现在,您可以根据需要使用filterarray显示
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle / scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
let filterarray = Array(DataDict.keys).filter { $0.contains("searchText")}
print("\(filterarray)")
for string in filterarray {
print("\(DataDict[string]!)")
}
try below method for searchingtext. Result can be displayed to table
func searchText(string:String) -> [String] {
let text = string
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle / scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
var searchedItems = [String]()
for key in DataDict.keys {
if text == key {
if let items = DataDict[key] {
searchedItems.removeAll()
searchedItems.append(contentsOf: items)
}
break;
}
else {
if let items = DataDict[key] {
let filterd = items.filter({ (x) -> Bool in
return x.lowercased().contains(text.lowercased())
})
if filterd.count > 0 {
searchedItems.append(contentsOf: filterd)
}
}
}
}
print("SearchedItems: \(searchedItems)")
return searchedItems
}
现在,您可以根据需要使用filterarray显示阵列,您也可以通过这种方式获得阵列,以实现更快的响应
try below method for searchingtext. Result can be displayed to table
func searchText(string:String) -> [String] {
let text = string
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle / scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
var searchedItems = [String]()
for key in DataDict.keys {
if text == key {
if let items = DataDict[key] {
searchedItems.removeAll()
searchedItems.append(contentsOf: items)
}
break;
}
else {
if let items = DataDict[key] {
let filterd = items.filter({ (x) -> Bool in
return x.lowercased().contains(text.lowercased())
})
if filterd.count > 0 {
searchedItems.append(contentsOf: filterd)
}
}
}
}
print("SearchedItems: \(searchedItems)")
return searchedItems
}
let arrTemp = Array(DataDict.keys).filter { $0.contains(searchBar.text!)}
print(DataDict[arrTemp[0]])
希望它对您有用……) 您也可以通过这种方式获取阵列,以获得更快的响应
let arrTemp = Array(DataDict.keys).filter { $0.contains(searchBar.text!)}
print(DataDict[arrTemp[0]])
希望它对您有用……) 我知道有点晚了,但我想发布一个使用flatMap和filter的改进答案
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle/scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
let searchText = "orange"
func search() {
var resultsArray = [String]()
if DataDict[searchText] != nil {
resultsArray = DataDict[searchText] ?? []
}else {
resultsArray = DataDict.flatMap{$0.1}.filter{ $0 == searchText}
}
print(resultsArray)
}
通过使用平面映射,您不需要迭代每个字符串数组,因为它将嵌套的dict展平为一个。有关flatMap的更多信息
希望这能有所帮助。我知道有点晚了,但我想通过使用平面图和过滤器发布一个改进的答案
var DataDict:[String:[String]] = [String:[String]]()
DataDict["fruits"] = ["apple","orange","pineapple","grape"]
DataDict["vehicle"] = ["car","cycle/scooter","bike"]
DataDict["colours"] = ["black","white","yellow","green","blue"]
let searchText = "orange"
func search() {
var resultsArray = [String]()
if DataDict[searchText] != nil {
resultsArray = DataDict[searchText] ?? []
}else {
resultsArray = DataDict.flatMap{$0.1}.filter{ $0 == searchText}
}
print(resultsArray)
}
通过使用平面映射,您不需要迭代每个字符串数组,因为它将嵌套的dict展平为一个。有关flatMap的更多信息
希望这有帮助。嘿,这对我来说很好。但这只会过滤键,对吗?是的,对于键数组,您需要再次过滤,并根据您对TableView的要求组合它们来准备最终的Filteredata数组嘿,这对我来说很好。但这只会过滤键,对吗?是的,对于键数组,您需要再次过滤,并根据您对tableview的要求组合它们来准备最终的Filteredata数组