Выбор ответа 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.
Варианты ответа
- Выведет
3: срез индексируется с нуля - Крэш: индекс 0 вне диапазона среза 2..<5правильный ответ
- Выведет
1: индекс берётся из исходного массива - Ошибка компиляции: у среза нет сабскрипта
Разбор
ArraySlice разделяет индексы с исходным массивом: у a[2...] startIndex равен 2, а не 0. Обращение к tail[0] это выход за границы и runtime trap. Правильно tail.first или tail[tail.startIndex], а если нужны индексы с нуля, Array(tail). Это частая ошибка в рекурсии вида func f(_ a: ArraySlice<Int>).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Swift: длина строки с флагом в разных представлениях
Следующий вопрос
Array, Set или Dictionary: как выбрать коллекцию
Ещё по теме «Коллекции и строки»
- Сложность append у Array в Swift
- ContiguousArray и мост с NSArray
- Подсчёт частот в словаре
- Порядок ключей в Dictionary
- Сложность операций коллекций Swift
- String и NSString: длина и индексы
- Как взять n-й символ строки в Swift
- Сколько символов в строке с флагом