Вопрос проверяет понимание различий между value type и reference type и того, как это отражается на хранении данных в коллекциях.
Массив хранит значение, если его элементы являются value type, и ссылку, если элементы — reference type. Для структур и enum в массиве лежат сами значения. Для классов в массиве лежат ссылки на объекты в куче. Это влияет на поведение при изменении элементов и на производительность. Массив при этом всегда остаётся value type.
Поведение массива напрямую зависит не от самого массива, а от типа элементов, которые в нём хранятся.
Если элементы массива — value type:
struct
enum
базовые типы (Int, Bool, Double)
то в буфере массива хранятся сами значения.
Особенности:
при копировании массива копируются значения (через Copy-on-Write)
изменение элемента не влияет на другие копии массива
поведение полностью предсказуемо
Пример:
struct Point {
var x: Int
}
var a = [Point(x: 1)]
var b = a
b[0].x = 10
// a[0].x всё ещё 1
Если элементы массива — reference type (class):
в буфере массива лежат ссылки на объекты
сами объекты живут в heap
Особенности:
копирование массива копирует ссылки
изменение объекта видно через все ссылки
семантика элементов — ссылочная
Пример:
class User {
var name: String
init(name: String) { self.name = name }
}
var a = [User(name: "Alex")]
var b = a
b[0].name = "Bob"
// a[0].name тоже "Bob"
От этого зависит:
ожидаемое поведение при изменениях
вероятность побочных эффектов
архитектурные решения
работа с потоками
Массив всегда value type, но его элементы могут быть как значениями, так и ссылками. Это ключевое отличие, которое часто становится источником неожиданных багов.