/ / Zmiana wartości w zagnieżdżonym słowniku w swift - swift

Zmiana wartości w zagnieżdżonym słowniku w swift - swift

Zastanawiam się, dlaczego przy ustawianiu wartości zagnieżdżonego słownika słownik zawierający nie odzwierciedla tych zmian? W linii 3, jest zwracana kopia zwróconego słownika?

var dic = Dictionary<String, AnyObject>()  // line1
dic["key"] = ["a":"a"] // line2
var dic2 = dic["key"] as Dictionary<String, String> // line3
dic2["a"] = "b" // line4
dic // key : ["a":"a"], would expect ["a":"b"]

Odpowiedzi:

8 dla odpowiedzi № 1

To dlatego, że słowniki są typami wartości, a nie typami odniesienia w Swift.

Kiedy zadzwonisz do tej linii ...

var dic2 = dic["key"] as Dictionary<String, String>

... tworzysz zupełnie nowy słownik, a nie odniesienie do wartości w dic. Zmiany w dic2 nie będzie odzwierciedlone w dic, bo dic2 jest teraz drugim całkowicie oddzielnym słownikiem. Jeśli chcesz dic aby odzwierciedlić zmiany, które wprowadziłeś, musisz ponownie przypisać wartość do odpowiedniego klucza dic, lubię to:

dic["key"] = dic2

Mam nadzieję, że pomaga ...


4 dla odpowiedzi nr 2

Roman ma rację, że kiedy stworzyłeś dic2, ponieważ słowniki przechodzą według wartości, tworzysz nowy słownik.

Możesz skopiować słownik z powrotem, zgodnie z opisem Uzyskaj dostęp do słownika w słowniku lub możesz zmodyfikować słownik na miejscu:

var dic = [String: [String: String]]() // Dictionary<String, Dictionary<String, String>>()  // line1
dic["key"] = ["a": "a"] // line2
dic["key"]?["a"] = "b"  // line4

1 dla odpowiedzi nr 3

Tak, w szybkich strukturach są przekazywane przez wartość nieodniesienie. Innymi słowy, otrzymujesz kopię o tych samych wartościach. Jak ja to rozumiem, to faktycznie robi jakąś optymalizację pod maską, przez co nie robi kopii, dopóki czegoś nie zmienisz. Bez względu na to, co dostajesz, jest oddzielną instancją słownika.

To samo dotyczy tablic.