Какой тип имеет срез (slice) массива в Swift?

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

Ответ

Срез массива в Swift имеет тип ArraySlice<Element>, где Element — тип элементов исходного массива.

ArraySlice — это view (представление) на часть исходного массива. Он не копирует данные, а ссылается на память оригинального массива.

let numbers = [10, 20, 30, 40, 50] // Array<Int>
let slice = numbers[1...3] // ArraySlice<Int> со значениями [20, 30, 40]
print(type(of: slice)) // Выведет: ArraySlice<Int>

Ключевые особенности ArraySlice:

  1. Сохранение исходных индексов: Индексы в ArraySlice соответствуют индексам в исходном массиве.
    print(slice.startIndex) // 1 (а не 0!)
    print(slice[2]) // 30 (элемент с индексом 2 исходного массива)
  2. Время жизни: ArraySlice хранит сильную ссылку на весь исходный массив. Пока жив срез, живет и весь массив, что может неожиданно продлить время жизни большой памяти.
  3. Конвертация в Array: Для долгосрочного хранения или передачи в API, ожидающий Array, срез следует преобразовать.
    let newArray = Array(slice) // [20, 30, 40] - тип Array<Int>, независимая копия.

Использование: ArraySlice эффективен для временной работы с частью данных без накладных расходов на копирование.