Swift 4.1: массив в словаре не обновляется

Это странное поведение сбивает меня с толку. Я намерен создать словарь с одним полем массива. Затем к этому массиву добавляются два дополнительных подсловаря. Вот код,

    var dictionary = [String: Any]()
    var array = [[String: Any]]()
    dictionary["array"] = array

    var dict1:[String:Any] = ["abc": 123, "def": true]
    var dict2:[String:Any] = ["111": 1.2345, "222": "hello"]
    array.append(dict1)
    array.append(dict2)

вывод отладчика.

введите здесь описание изображения

Как видно из вывода отладчика, массив var успешно обновлен (с добавлением двух подсловарей). Но dictionary["array"] по-прежнему имеет значение 0.

Похоже, что (dictionary["array"]) и (array) — это два отдельных объекта.


person jgtww    schedule 19.04.2018    source источник


Ответы (1)


Да, они отдельные. Элемент dictionary["array"] является неизменяемым значением типа Array<_>, поскольку он добавляется в словарь как тип значения, а не ссылочный тип.

Если вы попытались добавить dict1 в массив, обратившись к элементу через инкапсулирующий словарь следующим образом:

(dictionary["array"] as! Array).append(dict1)

Вы увидите такую ​​ошибку:

error: cannot use mutating member on immutable value of type 'Array<_>'

Из документы Swift Language, добавлено выделение:

Тип значения — это тип, значение которого копируется, когда оно присваивается переменной или константе или когда оно передается функции.

На самом деле вы широко использовали типы значений в предыдущих главах. Фактически, все основные типы в Swift — целые числа, числа с плавающей запятой, логические значения, строки, массивы и словари — являются типами значений и реализуются как структуры за кулисами.

person Craig    schedule 19.04.2018