2017-10-25 1 views
0

Ich versuche, den besten Weg in herauszufinden, um Werte zu einem Array hinzuzufügen, das ist ein Value in einem Dictionary. Ich möchte ein Wörterbuch mit Kontakten erstellen, sortiert nach dem ersten Buchstaben des Vornamens. Zum Beispiel [A: [Aaron, Adam, etc ...], B: [Brian, Bretagne, ect ...], ...]Hinzufügen von Elementen zu Array als ein Wörterbuch Wert

fand ich diese Funktion:

updateValue(_:forKey:)

und versuchte, sie in einer Schleife:

for contact in self.contacts.sorted() { 
    self.contactDictionary.updateValue([contact], forKey: String(describing: contact.characters.first))   
} 

Aber als ich versuchte, zu verwenden, dass sie die vorhandene Array durch einen neuen ersetzt. Ich weiß, dass ich manuell überprüfen kann, ob der Schlüssel im Wörterbuch vorhanden ist, wenn dies der Fall ist, das Array abrufen und dann einen neuen Wert anhängen, andernfalls das neue Schlüssel/Wert-Paar hinzufügen, aber ich bin mir nicht sicher, ob Swift eine einfachere/besserer Weg, dies zu tun.

Jeder Einblick würde sehr geschätzt werden!

Antwort

3

Sie reduce(into:) Methode (Swift4) und wie folgt verwendet werden:

let contacts = ["Aaron", "Adam", "Brian", "Brittany", ""] 
let dictionary = contacts.reduce(into: [String:[String]]()) { result, element in 
    // make sure there is at least one letter in your string else return 
    guard let first = element.first else { return } 
    // create a string with that initial 
    let initial = String(first) 
    // initialize an array with one element or add another element to the existing value 
    result[initial] = (result[initial] ?? []) + [element] 
} 
print(dictionary) // ["B": ["Brian", "Brittany"], "A": ["Aaron", "Adam"]] 

Wenn Sie swift3 oder eine frühere Version verwenden würden Sie ein veränderliches Ergebnis Wörterbuch innerhalb des Verschlusses erstellen müssen:

let contacts = ["Aaron", "Adam", "Brian", "Brittany", ""] 
let dictionary = contacts.reduce([String:[String]]()) { result, element in 
    var result = result 
    guard let first = element.first else { return result } 
    let initial = String(first) 
    result[initial] = (result[initial] ?? []) + [element] 
    return result 
} 
print(dictionary) // ["B": ["Brian", "Brittany"], "A": ["Aaron", "Adam"]] 

Beachten Sie, dass das Ergebnis nicht sortiert ist. Ein Wörterbuch ist eine ungeordnete Sammlung. Wenn Sie Ihr Wörterbuch sortieren und eine Reihe von (Schlüssel, Wert) zurückgeben Tupel Sie durch Schlüssel wie folgt sortiert verwenden:

let sorted = dictionary.sorted {$0.key < $1.key} 
print(sorted) 

„[(Taste:‚A‘, Wert: [“ Aaron " "Adam"]), (Taste: "B", Wert: [ "Brian", "Bretagne"])] \ n"

0

Swift 4 das neue Wörterbuch initializers kann alles für Sie tun:

let contactInitials = contacts.filter{!$0.isEmpty}.map{ ($0.first!,[$0]) } 
let dict = [Character:[String]](contactInitials, uniquingKeysWith:+) 
+0

Ja, aber Sie müssen nicht mehr auf Zeicheneigenschaft zugreifen –

+1

Tru e, alte Gewohnheiten sterben schwer. –

+0

Und das erfordert alle Elemente mindestens ein Zeichen zu haben –

Verwandte Themen