我有一本字典,
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
是fruit,那么tableview
应该显示完整的水果数组,否则searchText与DataDict的每个键内的单个对象匹配?
那么我将如何实现这一点来展示tableview
。我需要在searchBar
textDidChange委托中实现它。
Finllay我需要显示结果,DataDict
对象作为标题,它是各自的key
作为字幕。
例如:
apple
fruits
pineapple
fruits
你可以这样做,
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显示您的要求
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]])
希望它对你有用.. :)
我知道它已经很晚了,但是希望通过使用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)
}
通过使用平面地图,您不需要迭代每个字符串数组,因为它会将嵌套字典展平为一个。有关flatMap的更多信息https://medium.com/@abhimuralidharan/higher-order-functions-in-swift-filter-map-reduce-flatmap-1837646a63e8希望这会有所帮助。
创建Empty数组并初始化它将是DataDict的第一个键,并使其成为tableView的dataSource
然后每次搜索都会用匹配搜索的新内容替换它的内容并重新加载tableView