Изменение элементов массива в Swift

Я обнаружил очень странное поведение в Swift. Вот код:

var array2d: [[Int]] = [[1]]
print(array2d) // prints [[1]]

var first = array2d[0]
first.append(2)

print(array2d) // still prints [[1]]!!!

Я полностью ожидал, что последняя строка напечатает [[1, 2]]. Я не могу объяснить текущее поведение. Я ожидаю, что array2d[0] вернет ссылку на первый элемент или, возможно, копию этой ссылки. В любом случае изменение этого объекта должно изменить array2d. Но это не то, что происходит.

Если же я обновлю массив следующим образом:

array2d[0].append(2)

затем он, как и ожидалось, печатает [[1, 2]].

Может кто-нибудь объяснить мне это?


person TotoroTotoro    schedule 28.03.2016    source источник


Ответы (1)


То, как на массивы ссылаются / передаются / копируются в быстром режиме, вызывает много споров, взгляните на эту ссылку.

По сути, происходит то, что var first = array2d[0] делает копию массива по этому индексу, а не создает ссылку, как вы ожидали. Следовательно, доступ к массиву с использованием нижнего индекса позволяет вам правильно изменить массив, а создание новой переменной - нет.

person Blake Lockley    schedule 28.03.2016
comment
Другими словами, он делает полную копию всего? - person TotoroTotoro; 29.03.2016