Создает ли ArraySlice в Swift новый независимый массив в памяти?

«Создает ли ArraySlice в Swift новый независимый массив в памяти?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, ArraySlice не создает новый независимый массив сразу. Он является видом (view) на часть исходного массива и использует ту же самую область памяти.

Как это работает:

let numbers = [10, 20, 30, 40, 50, 60, 70]
let slice: ArraySlice<Int> = numbers[2...5] // Элементы 30, 40, 50, 60
// Память для элементов [30, 40, 50, 60] НЕ копируется.
// `slice` хранит ссылку на `numbers` и диапазон индексов (startIndex, endIndex).

Важное предупреждение о Copy-on-Write (CoW): Хотя ArraySlice изначально делит память с исходным массивом, механизм Copy-on-Write Swift может привести к неявному копированию:

var originalArray = [1, 2, 3, 4, 5]
var slice = originalArray[1..<4] // slice = [2, 3, 4], общая память

// Модификация ЧЕРЕЗ slice вызывает копирование,
// так как `originalArray` и `slice` теперь должны различаться.
slice[2] = 100 // slice = [2, 3, 100]
// Теперь `slice` имеет свою собственную копию данных.
// `originalArray` остается [1, 2, 3, 4, 5]

Ключевые выводы:

  1. Эффективность: ArraySlice эффективен для временной работы с подмассивом без накладных расходов на копирование.
  2. Время жизни: ArraySlice поддерживает исходный массив от деаллокации. Пока slice существует, весь исходный массив остается в памяти.
  3. Использование: Идеален для операций внутри функции, но не предназначен для долгосрочного хранения. Для сохранения результата преобразуйте его в Array: let newArray = Array(slice).