Семантика индексов ArraySlice
Узнайте, почему индексы среза сохраняют исходные позиции.
«Семантика индексов 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 — локальная установка не требуется.
Все уроки этого курса
- Создание срезов с помощью диапазонов
- Семантика индексов ArraySlice
- Преобразование срезов обратно в массивы
- prefix, suffix и dropFirst