2017-06-09 11 views
0

Ich möchte nach dem Schlüssel ID im Wörterbuch suchen. Ich habe ein Wörterbuch wie folgt aus:Suche Tasten im Wörterbuch swift

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

Tabellendaten 307 Artikel hat und alle id ist einzigartig. Ich möchte im Wörterbuch Schlüssel ID, wie wenn ich schreibe "get", es brauche die zeigen alle Suchergebnisse mit "get" in der Tabellenansicht.

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() 
} 

Wenn ich versuche, ein Wort zu suchen, er druckt „no match“, in dem Debug, nicht in der Lage, Daten zu lesen, schreibt für den Wert des Eintrags. Vielen Dank im Voraus!

+0

Sie wollen mit IDs suchen? –

+0

Geben Sie ein Beispiel dafür, was Sie wollen – Tj3n

+0

'Eintrag' ist ein Array? –

Antwort

0

In der Tat Ihre Schlüssel müssen eindeutig sein und wie in Ihrem Fall id ist ein Top-Level-Schlüssel Sie nicht zu Führen Sie eine Filterung durch, um auf ihren Wert zuzugreifen. Verwenden Sie einfach tableData[searchText], um den Wert zu ermitteln.

Wenn Sie nicht wissen, die id Wert und Sie möchten über alle Schlüssel in einer Schleife können Sie dies tun wie

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

Per was Sie Sie an der richtigen Stelle bereits die folgende

tun müssen
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") 
} 

Oder Sie können einfach eine neue gefilterte Array aus Ihrer Datenquelle wie

erhalten
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

Ich machte eine ähnliche Lösung, danke für Ihre Hilfe! – slytrkmn

0

Verwenden Sie den folgenden Code, um auf ein Element in einem Dictionary mit einem Schlüssel zuzugreifen.

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

Für weitere Informationen, haben Sie einen Blick auf:

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

+0

Ich habe eine eindeutige ID 307 . Und ich kenne nicht alle Namen, ich will darin suchen, wie wenn ich ** schreibe ** schreibe, muss es alle Suchergebnisse mit ** erhalten ** in der Tabellenansicht anzeigen. – slytrkmn

0

Versuchen first(where:) direkt auf tableData verwenden, wie folgt aus:

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() 
}