Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 实现字典内搜索的搜索结果?_Swift_Nsdictionary_Uisearchbar - Fatal编程技术网

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数组