2017-06-09 110 views
0

我想在字典中搜索关键字id。我有一本字典是这样的:快速搜索字典中的键

var tableData:[String:Any] = ["id":["path":"","type":"","parameters":[]]] 

表数据有307项,所有ID独特。我想查字典键id,就像我写“得到”,它需要在表格视图中显示“得到”的所有搜索结果。

func updateSearchResults(for searchController: UISearchController) { 
    let searchString = searchController.searchBar.text 

    if let entry = tableData.keys.first(where: { $0.lowercased().contains(searchString) }) { 
     print(entry) 
    } else { 
     print("no match") 
    } 
    tableView.reloadData() 
} 


func didChangeSearchText(searchText: String) { 

    if let entry = tableData.keys.first(where: { $0.lowercased().contains(searchText) }) { 
     print(entry) 
    } else { 
     print("no match") 
    } 
    // Reload the tableview. 
    tableView.reloadData() 
} 

当我试图寻找它打印一个字“不匹配”,在调试,无法读取数据为进入的值写入。先谢谢你!

+0

想要使用ID搜索吗? –

+0

举一个你想要的例子 – Tj3n

+0

'entry'是一个数组? –

回答

0

其实你的钥匙必须是唯一的,因为你的情况id是你没有到顶部一级重点执行过滤以便访问其值。只需使用tableData[searchText]即可获得其价值。

如果你不知道id价值,要遍历所有的键,你可以这样做

for key in tableData.keys { 
    print(key) 
    let value = tableData[key] 
    // or do whatever else you want with your key value 
} 

按照你已经在的地方,你需要做以下

var tableData:[String:Any] = ["hello world":["path":"fgh","type":"dfghgfh","parameters":[]], "something else":["path":"sdfsdfsdf","type":"dfghfghfg","parameters":[]]] 

if let entry = tableData.keys.first(where: { $0.lowercased().contains("hello") }) { 
    print(entry) 
    // prints 'hello world' 
} else { 
    print("no match") 
} 

或者你可以简单地从你的数据源的新过滤阵列状

let result = tableData.filter { (key, value) in 
    key.lowercased().contains("else") // your search text replaces 'else' 
} 
/* 
* result would be an array with the objects based on your id search 
* so you'll not only have the keys but the entire object as well 
*/ 
print("Found \(result.count) matches") 
+0

我提出了类似的解决方案,谢谢你的帮助! – slytrkmn

0

要使用键访问字典中的元素,请使用以下代码。

if let entry = tableData[searchText] { 
    print(entry) 
} 

欲了解更多信息,看看:

how can i get key's value from dictionary in Swift?

+0

我有独特的307 id 。而且我不知道所有的名字,我想在其中进行搜索,就像我在写**获得**时一样,它需要在表格视图中显示带有**的所有搜索结果。 – slytrkmn

0

直接在tableData上尝试使用first(where:),如下所示:

func updateSearchResults(for searchController: UISearchController) { 
    guard let searchString = searchController.searchBar.text else { return } 

    if let (id, entry) = tableData.first(where: { (key, value) -> Bool in key.lowercased().contains(searchString) }) { 
     print(entry) 
    } else { 
     print("no match") 
    } 
    tableView.reloadData() 
} 


func didChangeSearchText(searchText: String) { 

    if let (id, entry) = tableData.first(where: { (key, value) -> Bool in key.lowercased().contains(searchText) }) { 
     print(entry) 
    } else { 
     print("no match") 
    } 
    // Reload the tableview. 
    tableView.reloadData() 
}