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.