Swift Academy · Урок

Семантика индексов ArraySlice

Узнайте, почему индексы среза сохраняют исходные позиции.

Урок 2 из 413 шагов

«Семантика индексов ArraySlice» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Срезы сохраняют исходные индексы

Важная особенность: ArraySlice не начинает индексацию с нуля. Он сохраняет те же индексы, которые были у него в родительском массиве.

let arr = [10, 20, 30, 40, 50]
let slice = arr[2..<5]
print(slice.startIndex)
print(slice.endIndex)

startIndex не всегда равен нулю

Значение startIndex среза равно нижней границе, использованной при его создании. Для arr[2..<5] начальный индекс равен 2.

let arr = [1, 2, 3, 4, 5, 6]
let slice = arr[3..<6]
print("start:", slice.startIndex)
print("first value:", slice[slice.startIndex])

Индексация среза

Поскольку индексы сохраняются, необходимо использовать собственные индексы среза. Обращение к slice[0] у среза, начинающегося с индекса 2, вызовет сбой во время выполнения.

let arr = [100, 200, 300, 400]
let slice = arr[2..<4]
print(slice[2])
print(slice[3])

Безопасное использование startIndex

Чтобы получить первый элемент независимо от начальной позиции среза, используйте slice.first или slice[slice.startIndex].

let arr = [5, 6, 7, 8, 9]
let slice = arr[2..<5]
print(slice.first ?? -1)
print(slice[slice.startIndex])

endIndex указывает за последний элемент

Как и в массивах, endIndex указывает на позицию сразу после последнего допустимого элемента. Обращение по индексу endIndex недопустимо.

let arr = [11, 22, 33, 44]
let slice = arr[1..<3]
print("endIndex:", slice.endIndex)
print("last valid:", slice[slice.endIndex - 1])

Подсчёт и индексация

Значение count среза — это количество элементов, которое может отличаться от его endIndex. Никогда не предполагайте, что count равен последнему индексу.

let arr = [0, 1, 2, 3, 4, 5]
let slice = arr[3..<6]
print("count:", slice.count)
print("startIndex:", slice.startIndex)

Свойство индексов

Используйте свойство indices, чтобы безопасно перебрать допустимый диапазон индексов среза.

let arr = [10, 20, 30, 40, 50]
let slice = arr[1..<4]
for i in slice.indices {
    print(i, slice[i])
}

Зачем сохранять индексы

Сохранение индексов позволяет сопоставить позицию в срезе с исходным массивом без дополнительного учёта. Найденный индекс также допустим в родительском массиве.

let arr = ["a", "b", "c", "d", "e"]
let slice = arr[2..<5]
if let idx = slice.firstIndex(of: "d") {
    print("found at parent index:", idx)
    print("parent has:", arr[idx])
}

enumerated() возвращает смещения с нуля

Если нужны позиции с отсчётом от нуля, используйте enumerated(). Эта функция возвращает смещения, начинающиеся с 0, независимо от значения startIndex среза.

let arr = [9, 8, 7, 6, 5]
let slice = arr[2..<5]
for (offset, value) in slice.enumerated() {
    print(offset, value)
}

Расстояние от начала

Чтобы вычислить смещение с отсчётом от нуля для индекса, используйте distance(from:to:).

let arr = [1, 2, 3, 4, 5]
let slice = arr[2..<5]
let idx = slice.startIndex + 1
let offset = slice.distance(from: slice.startIndex, to: idx)
print("offset:", offset, "value:", slice[idx])

Распространённая ошибка

Забыть, что срезы сохраняют индексы родительского массива, — одна из самых распространённых ошибок в Swift. Всегда отдавайте предпочтение first, enumerated() или startIndex, а не жёстко заданному 0.

let arr = [100, 200, 300, 400, 500]
let slice = arr[3..<5]
// Safe: use first, not slice[0]
print(slice.first ?? 0)

Быстрая проверка

Потренируйтесь рассуждать об индексах срезов.

Итоги

ArraySlice сохраняет индексы родительского массива: его startIndex равен нижней границе, а не нулю. Для безопасного доступа используйте first, startIndex, indices или enumerated(), но никогда не используйте жёстко заданный 0.

let slice = [5, 6, 7, 8, 9][3..<5]
print(slice.startIndex, slice.first ?? -1)
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Семантика индексов ArraySlice» бесплатный?

Да — полный текст урока «Семантика индексов ArraySlice» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Семантика индексов ArraySlice»?

Узнайте, почему индексы среза сохраняют исходные позиции. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Семантика индексов ArraySlice»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание срезов с помощью диапазонов
  2. Семантика индексов ArraySlice
  3. Преобразование срезов обратно в массивы
  4. prefix, suffix и dropFirst
← Назад к Swift Academy