2017-01-03 4 views
0

nicht aufrufen Das Ziel dieses Codes unten ist das Ausfiltern von Wörterbüchern mit einer bestimmten ID, wobei ID eine Zeichenfolge ist.Swift: Filterfunktion für ein Array von Wörterbüchern verwenden? Fehler: Kann 'Filter' mit einer Argumentliste vom Typ

let dictArray = networkData["dicts"] as! [[String:AnyObject]] 
    localData["dicts"] = dictArray.filter{ ($0["id"] as! String) != sample.getId() } 

Dieser Code erzeugt jedoch einen Fehler:

Cannot invoke 'filter' with an argument list of type '(([String : AnyObject]) throws -> Bool)'

Basierend auf anderen SO Antworten wie this one und this one, es scheint der Fehler ist die Wörterbücher nicht übereinstimmen Equatable.

So ist die einzige Option für die Verwendung filter, um eine benutzerdefinierte Klasse zu erstellen, um das Array von Wörterbüchern aufzunehmen und diese Klasse Equatable konform zu machen?

Wenn ja, scheint es sauberer zu sein, einfach zu iterieren und ein neues Array zu erstellen.

+0

Was sind * Hash-Objekte *? – Alexander

+0

Bitte stellen Sie sicher, dass Sie 'filteredData definieren: [String: [[String: AnyObject]]]' – bubuxu

+0

@Alexander Er bedeutet wahrscheinlich Wörterbücher – matt

Antwort

1

Filtering [[String: ANYOBJECT]] (auch bekannt als Array>) führt zu einem anderen [[String: ANYOBJECT]]. Sie versuchen, dies einer Variablen des Typs AnyObject zuzuordnen, die in Swift 3 nicht zulässig ist, da Arrays Strukturen, keine Objekte sind.

Erstellen Sie eine typsichere Struktur oder ein Objekt, das diese Daten enthält, und nicht ein Diktat.

Zum Beispiel:

let dictArray = networkData["dicts"] as! [[String:AnyObject]] 
let filteredDicts = dictArray.filter{ ($0["id"] as! String) != sample.getId() }   
localData["dicts"] = filteredDicts 
+0

danke! aber um genau zu sein, ordnen wir das Array von Wörterbüchern einem var des Typs AnyObject zu (was auch nicht in swift funktioniert). – Crashalot

+0

@Crashalot Guter Punkt. Sie können meine Antwort erweitern. Bitte akzeptieren Sie es, wenn es geholfen hat, – Alexander

+0

bereits upvoted. habe nur nicht akzeptiert, da immer noch der Code behoben werden muss. :) Keine Sorge, Sie erhalten die Punkte, wenn dies zur Lösung führt. :) – Crashalot

1

Das Problem besteht nicht darin, dass Hash-Objekte nicht Equatable entsprechen, weil Sie String verwenden, um den Vergleich durchzuführen.

Ich habe den Code läuft gut in Spielplatz:

// make sure data is type of [String: [[String: AnyObject]]] 
// make sure filteredData is type of [String: [[String: AnyObject]]] 

let key = "hashes" 
if let hashArray = data[key] { 
    let id = sample.getId() // make sure it's String type 
    filteredData[key] = hashArray.filter { ($0["id"] as? String) != id } 
} 
Verwandte Themen