私は入れ子になった辞書の値を設定するときに、その辞書を含む辞書がその変更を反映しないのはなぜだろうか? 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
はい、迅速な構造体では値渡しされません。参照。言い換えると、同じ値を持つコピーを取得しています。私が理解しているように、それは実際にあなたが何かを変えるまで実際にコピーを作るのではなく、実際にはいくつかの最適化を行います。
配列についても同じことが起こります。