在字典中搜索搜索结果?

问题描述 投票:1回答:5

我有一本字典,

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
swift nsdictionary uisearchbar
5个回答
1
投票

你可以这样做,

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显示您的要求


1
投票
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
    }

1
投票

您可以通过这种方式获得阵列,以便更快地响应..

let arrTemp = Array(DataDict.keys).filter { $0.contains(searchBar.text!)}
print(DataDict[arrTemp[0]])

希望它对你有用.. :)


1
投票

我知道它已经很晚了,但是希望通过使用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希望这会有所帮助。


0
投票

创建Empty数组并初始化它将是DataDict的第一个键,并使其成为tableView的dataSource

然后每次搜索都会用匹配搜索的新内容替换它的内容并重新加载tableView

© www.soinside.com 2019 - 2024. All rights reserved.