/ / swift - swiftでネストされた辞書の値を変更する

スウィフトスウィフトでネストされた辞書の値を変更する

私は入れ子になった辞書の値を設定するときに、その辞書を含む辞書がその変更を反映しないのはなぜだろうか? 3行目には、返される辞書のコピーがありますか?

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"]

回答:

回答№1は8

辞書は値型であり、Swiftの参照型ではないためです。

この行を呼び出すと...

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

...あなたは全く新しい辞書を作成しています。 dic。変更点 dic2 反映されません dic、なぜなら、 dic2 2番目の完全に別の辞書になりました。お望みならば dic あなたが行った変更を反映させるために、あなたはその値を適切なキーに再割り当てする必要があります dic、 このような:

dic["key"] = dic2

希望は役立ちます...


回答№2については4

あなたが作成したときにローマは正しい dic2辞書は価値があるため、新しい辞書を作成しています。

説明されているように、辞書を元に戻すか 辞書の辞書にアクセスする 辞書を修正することもできます:

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

回答№3の場合は1

はい、迅速な構造体では値渡しされません。参照。言い換えると、同じ値を持つコピーを取得しています。私が理解しているように、それは実際にあなたが何かを変えるまで実際にコピーを作るのではなく、実際にはいくつかの最適化を行います。

配列についても同じことが起こります。