Выбор ответа Senior Коллекции и строки обновлено

Индексы ArraySlice

Вопрос

Что произойдёт при выполнении кода?

let a = [1, 2, 3, 4, 5]
let tail = a[2...]
print(tail[0])

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Крэш: индекс 0 вне диапазона среза 2..<5. ArraySlice разделяет индексы с исходным массивом: у a[2...] startIndex равен 2, а не 0.

Варианты ответа

  1. Выведет 3: срез индексируется с нуля
  2. Крэш: индекс 0 вне диапазона среза 2..<5правильный ответ
  3. Выведет 1: индекс берётся из исходного массива
  4. Ошибка компиляции: у среза нет сабскрипта

Разбор

ArraySlice разделяет индексы с исходным массивом: у a[2...] startIndex равен 2, а не 0. Обращение к tail[0] это выход за границы и runtime trap. Правильно tail.first или tail[tail.startIndex], а если нужны индексы с нуля, Array(tail). Это частая ошибка в рекурсии вида func f(_ a: ArraySlice<Int>).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.