In Scala gibt der Operator + (k -> v)
unter immutable.Map
einen neuen immutable.Map
mit dem Inhalt des Originals und dem neuen Schlüssel/Wert-Paar zurück. In C# gibt ImmutableDictionary.add(k, v)
einen neuen, aktualisierten ImmutableDictionary
zurück.Wie kann ich an ein unveränderbares Wörterbuch in Swift "anhängen"?
In Swift jedoch scheint Dictionary
nur die mutierende updateValue(v, forKey: k)
Funktion und den mutierenden [k:v]
Operator zu haben.
Ich dachte, vielleicht ich etwas Trick mit flatten()
spielen konnte, aber kein Glück:
let updated = [original, [newKey: newValue]].flatten()
bringt mich
Cannot convert value of type '() -> FlattenCollection<[[String : AnyObject]]>'
to specified type '[String : AnyObject]'
Wie erstelle ich ein neues, Dictionary
von den Inhalten ein unveränderlich geändert existierende?
Update: Basierend auf this answer ‚s zur Kenntnis, dass Swift Wörterbücher Werttypen sind, und this answer‘ s wandelbar Version, kam ich auf die folgende Erweiterung Betreiber, aber ich bin darüber nicht begeistert - es scheint, als müsste es eine sauberere Alternative geben.
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 das richtig verstehe), dass die Unveränderlichkeit der Swift Wörterbücher auf let
eine Compiler Prüfung eher als eine Frage der unterschiedlichen Implementierungsklassen bedeutet dies das Beste ist, was getan werden kann?
Update # 2: Wie in Jules's answer erwähnt, Modifizieren unveränderliche Wörterbücher, die nicht speziell optimiert sind Zustand zwischen Kopien zu teilen (wie Swift Wörterbücher sind nicht) präsentiert Performance-Probleme. Für meinen aktuellen Anwendungsfall (AttributedString
Attributwörterbücher, die eher klein sind) kann es dennoch gewisse Dinge vereinfachen, um es wert zu sein, aber bis Swift ein unveränderbares Wörterbuch mit gemeinsamem Status implementiert, ist es wahrscheinlich keine gute Idee im Allgemeinen Fall - was ein guter Grund ist, es nicht als eingebaute Funktion zu haben.
Sieht aus wie jemand baut eine Bibliothek, um genau das zu tun https://github.com/tLewisII/ImStructures (Disclaimer: Ich habe es nicht überprüft.) –
*, dass die Unveränderlichkeit der Swift-Wörterbücher ist ein Compiler-Check [. ..] verschiedene Implementierungsklassen * Das ist falsch. Wörterbücher werden als Strukturen implementiert, was bedeutet, dass sie (grundsätzlich) von der Kopie übernommen werden. Jeder Strukturwert, der in einer 'let' -Variable gespeichert ist, ist unveränderlich, daher können Sie keine' muting'-Methoden aufrufen, da diese den Wert ändern würden. Wenn Sie ein Dictionary (irgendeine Struktur) einer 'var'-Variable zuweisen, wird es kopiert! Sie haben dann ein anderes Wörterbuch mit einem neuen Speicherort. – idmean