2015-02-20 2 views
4

Мне интересно, почему при установке значения вложенного словаря словарь, содержащий словарь, не отражает эти изменения? В строке 3 есть копия возвращаемого словаря?Изменение значения в вложенном словаре в swift

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

ответ

8

Это потому, что словари являются типами значений, а не ссылочными типами в Swift.

Когда вы вызываете эту линию ...

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

... вы создаете совершенно новый словарь, а не ссылка на значение в dic. Изменения в dic2 не отражаются на dic, потому что dic2 теперь является вторым полностью отдельным словарем. Если вы хотите dic, чтобы отразить изменения, которые вы сделали, вам необходимо переназначить значение соответствующего ключа в dic, как это:

dic["key"] = dic2 

Надежда, что помогает ...

1

Да, в быстрых структурах передается значение без ссылки. Другими словами, вы получаете копию с одинаковыми значениями. Насколько я понимаю, на самом деле это делает некоторую оптимизацию под капотом, в результате чего она фактически не делает копию, пока вы ничего не измените. Независимо от того, что вы получаете, это отдельный экземпляр словаря.

То же самое относится к массивам.

4

Roman является правильным, что, когда вы создали dic2, потому что словари передаются по значению, вы создаете новый словарь.

Вы можете либо скопировать словарь обратно, как указано Access a dictionary in dictionary или вы можете изменить словарь в месте:

var dic = [String: [String: String]]() // Dictionary<String, Dictionary<String, String>>() // line1 
dic["key"] = ["a": "a"] // line2 
dic["key"]?["a"] = "b" // line4 
Смежные вопросы