Wie kann ich ein unveränderliches Wörterbuch in Swift "anhängen"?

n Scala, der+ (k -> v) operator onimmutable.Map gibt ein neues @ zurüimmutable.Map mit dem Inhalt des Originals plus dem neuen Schlüssel / Wert-Paar. Ebenso in C #,ImmutableDictionary.add(k, v) gibt ein neues, aktualisiertes @ zurüImmutableDictionary.

In Swift jedochDictionary scheint nur das mutierende @ zu habupdateValue(v, forKey: k) Funktion und das mutierende[k:v] Operator

Ich dachte, vielleicht könnte ich mit @ einen Streich spielflatten(), aber kein Glück:

let updated = [original, [newKey: newValue]].flatten()

get me

Cannot convert value of type '() -> FlattenCollection<[[String : AnyObject]]>' 
to specified type '[String : AnyObject]'

Wie erstelle ich eine neue, geänderte unveränderlicheDictionary aus dem Inhalt eines bestehenden?

Aktualisieren Beyogen aufdiese Antwortinweis von @, dass Swift-Wörterbücher Werttypen sind, unddiese Antworts veränderbare Version, ich habe den folgenden Erweiterungsoperator gefunden, bin aber nicht begeistert - es scheint, als gäbe es eine sauberere Out-of-the-Box-Alternative.

func + <K, V>(left: [K:V], right: [K:V]) -> [K:V] {
    var union = left
    for (k, v) in right {
        union[k] = v
    }
    return union
} 

Aber vielleicht die Tatsache (wenn ich es richtig verstehe), dass die Unveränderlichkeit von Swift-Wörterbüchern eine Compiler-Prüfung auf @ ilet statt einer Frage verschiedener Implementierungsklassen bedeutet dies, dass dies das Beste ist, was getan werden kann?

Update # 2: Wie in @ vermer Jules Antwort: Das Ändern unveränderlicher Wörterbücher, die nicht speziell für die gemeinsame Nutzung des Status zwischen Kopien optimiert sind (da Swift-Wörterbücher keine sind), führt zu Leistungsproblemen. Für meinen aktuellen Anwendungsfall AttributedString -Attribut-Wörterbücher, die in der Regel recht klein sind, vereinfachen zwar bestimmte Dinge, die sich lohnen, aber solange Swift kein unveränderliches Shared-State-Wörterbuch implementiert, ist dies im Allgemeinen wahrscheinlich keine gute Idee guter Grund, es nicht als eingebautes Feature zu haben.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage