W Scala operator + (k -> v)
pod numerem immutable.Map
zwraca nową wartość immutable.Map
wraz z zawartością oryginału oraz nową parą klucz/wartość. Podobnie w C#, ImmutableDictionary.add(k, v)
zwraca nową, zaktualizowaną ImmutableDictionary
.Jak mogę "dołączyć" do niezmiennego słownika w Swift?
Jednak w języku Swift, Dictionary
wydaje się mieć tylko funkcję mutowania updateValue(v, forKey: k)
i mutujący operator [k:v]
.
pomyślałem, że może mógłbym zagrać jakąś sztuczkę z flatten()
, ale bez powodzenia:
let updated = [original, [newKey: newValue]].flatten()
dostaje mi
Cannot convert value of type '() -> FlattenCollection<[[String : AnyObject]]>'
to specified type '[String : AnyObject]'
Jak utworzyć nowy, zmodyfikowany niezmienne Dictionary
z treści istniejący?
Aktualizacja: podstawie „s notatki że słowniki Swift są typy wartości, a this answer” this answer zmienny wersji s, wpadłem na następujący operatora wewnętrznego, ale nie jestem podekscytowany - wygląda na to, że musi istnieć czystsza, gotowa alternatywa.
func + <K, V>(left: [K:V], right: [K:V]) -> [K:V] {
var union = left
for (k, v) in right {
union[k] = v
}
return union
}
Ale może fakt (jeśli dobrze rozumiem), że niezmienność słowników Swift jest sprawdzenie kompilator na let
aniżeli kwestia różnych klas realizacji Oznacza to najlepsze, co można zrobić?
Aktualizacja # 2: Jak zauważono w Jules's answer, modyfikując niezmienne słowniki, które nie są specjalnie zoptymalizowane do dzielenia stan między kopiami (jak słowniki Swift nie są) stwarza problemy z wydajnością. Dla mojego obecnego przypadku użycia (AttributedString
słowniki atrybutów, które wydają się być dość małe) może jeszcze uprościć pewne rzeczy na tyle warte, aby być warte zrobienia, ale dopóki Swift nie wdroży niezmiennego słownika dla stanu wspólnego, prawdopodobnie nie jest to dobry pomysł w ogólnym przypadku - co jest dobrym powodem, aby nie mieć go jako wbudowanej funkcji.
Wygląda jak ktoś buduje bibliotekę właśnie do tego https://github.com/tLewisII/ImStructures (Zastrzeżenie:. I nie sprawdzone go) –
* że niezmienność Swift słowników jest sprawdzenie kompilator [. ..] różne klasy implementacji * To jest złe. Słowniki są implementowane jako structs, co oznacza, że są (w zasadzie) przekazywane przez kopie. Każda wartość struct zapisana w zmiennej 'let' jest niezmienna, dlatego nie można na niej wywoływać metod' mutating', ponieważ mogłyby one zmienić wartość. Jeśli przypiszesz słownik (dowolną strukturę) do zmiennej 'var', zostanie on skopiowany! Następnie masz inny słownik z nową lokalizacją w pamięci. – idmean