2016-07-17 15 views
0

Ich bin neu in Swift und iOS Dev. Im Algemeinen. Ich habe mich gefragt, wie ich mehrere Werte aus dem gleichen Schlüssel in verschiedenen Wörterbüchern zusammenfassen könnte. z.B. Ich habeWie kann man mehrere Werte aus dem gleichen Schlüssel über verschiedene Wörterbücher hinweg zusammenfassen?

20 Wörterbücher mit dem gleichen Schlüsselwertpaar [String: AnyObject] z. "Höhe": 20 Ich möchte diese Summe addieren und den Durchschnitt berechnen. Beispiel:

// Example dictionary 
let player17: [String: AnyObject] = [ 
    "Name": "Les Clay", 
    "Height": 42, 
    "Soccer Experience": true, 
    "Guardian Name(s)": "Wynonna Brown" 
] 

Gebraucht // jedes Objekt hier, da sie alle in ein großes Array gehen

+1

Sind Ihre 20 Wörterbücher an sich in einem Container enthalten? Wenn Sie mit Daten arbeiten möchten, die in verschiedenen Wörterbüchern enthalten sind, verschachteln Sie möglicherweise Ihre Wörterbücher in einem einzelnen Wörterbuch oder Array. Als Alternative zur Verwendung eines 'String: AnyObject' -Diktates, in Anbetracht dessen, dass die verschiedenen _types_der Spielerdaten etwas statisch sind (bekannt zur Kompilierzeit), sollten Sie Ihre Spielerdaten als Instanzmitglieder einer' struct' definieren (daher nicht muss mit 'AnyObject' arbeiten. – dfri

+0

Ja vergessen zu sitzen, sie sind alle in einem Array namens allPlayers –

Antwort

1

können Sie reduce verwenden, um Zahlen zu addieren, wie folgt aus:

let totalHeight = allPlayers.reduce(0) { (p, c) -> Int in 
    return p + (c["Height"] as! Int) 
} 

Hinweis: Der c["Height"] as! Int Ansatz erfordert harte Kenntnisse, dass "Height" Schlüssel in jedem Wörterbuch vorhanden ist, und sein Wert ist vom Typ Int. Andernfalls wird zur Laufzeit eine Ausnahme ausgelöst.

Wenn einige Ihrer Wörterbücher nicht den richtigen Schlüssel in ihnen haben, oder den Wert eines anderen Typs enthalten, müssen Sie-Filter vor oder eine optionale Guss, zB

return p + ((c["Height"] as? Int) ?? 0) 
+0

@dfri Just versucht dies in Spielplatz, funktioniert wie ein Charme. – dasblinkenlight

+0

@dfri Hier ist ein [Link zu Pastebin] (http://pastebin.com/mzTtTprc), wenn Sie es ausprobieren möchten. – dasblinkenlight

+1

@dfri: Das liegt daran, dass Ihr Array ein * leeres Wörterbuch * enthält, für das 'c [" Height "] == nil'. –

1

Gegeben

let players: [[String:AnyObject]] = ... 

hier ist ein weiterer Ansatz

let sum = players.flatMap { $0["Height"] as? Int }.reduce(0, combine: +) 

Wenn ein Wörterbuch keinen gültigen Wert Int für den Schlüssel "Height" hat, wird dieses Wörterbuch ignoriert.