← Назад к вопросам
Какой subscript у массива?
1.0 Junior🔥 221 комментариев
#Коллекции и структуры данных
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ на вопрос о subscript у массива в Swift
У массива в Swift существует индексный subscript, который позволяет получить или установить элемент по целочисленному индексу. Это основной способ доступа к элементам коллекции.
Базовый синтаксис
// Получение элемента по индексу
let array = [10, 20, 30, 40, 50]
let thirdElement = array[2] // 30
// Установка элемента по индексу
var mutableArray = [1, 2, 3, 4]
mutableArray[1] = 20 // Теперь массив [1, 20, 3, 4]
Range Subscript для получения среза
Массивы также поддерживают range subscript, который позволяет получить срез (ArraySlice) по диапазону индексов:
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// Получение среза с 3 по 7 элемент (индексы 2...6)
let slice = numbers[2...6] // ArraySlice [3, 4, 5, 6, 7]
// Получение среза с начала до 4 элемента
let prefixSlice = numbers[...4] // [1, 2, 3, 4, 5]
// Получение среза с 5 элемента до конца
let suffixSlice = numbers[5...] // [6, 7, 8, 9, 10]
Range Subscript для модификации нескольких элементов
var mutableNumbers = [10, 20, 30, 40, 50]
// Замена диапазона элементов
mutableNumbers[1...3] = [25, 35, 45]
// Теперь массив [10, 25, 35, 45, 50]
// Можно заменить разное количество элементов
mutableNumbers[2...4] = [100]
// Теперь массив [10, 25, 100]
Важные особенности и безопасность
- Проверка границ: Swift выполняет проверку выхода за границы массива, что предотвращает распространенные ошибки:
let array = [1, 2, 3]
// array[5] // Ошибка времени выполнения: fatal error: Index out of range
- ArraySlice vs Array: Важно понимать разницу:
let array = [1, 2, 3, 4, 5]
let slice = array[1...3] // ArraySlice [2, 3, 4]
// ArraySlice - это представление оригинального массива
// Он хранит ссылку на оригинальный массив, а не копирует элементы
// Его можно преобразовать обратно в Array:
let newArray = Array(slice) // [2, 3, 4]
- Partial ranges для удобства работы:
let names = ["Anna", "Boris", "Clara", "Dmitry"]
// Диапазон от начала до индекса 2 (включительно)
let firstThree = names[...2] // ["Anna", "Boris", "Clara"]
// Диапазон от индекса 1 до конца
let fromSecond = names[1...] // ["Boris", "Clara", "Dmitry"]
// Диапазон от начала до индекса 2 (не включая)
let upToTwo = names[..<2] // ["Anna", "Boris"]
Практические примеры использования
// Обмен двух элементов
var colors = ["red", "green", "blue", "yellow"]
(colors[0], colors[2]) = (colors[2], colors[0])
// Теперь ["blue", "green", "red", "yellow"]
// Быстрое удаление элементов
var numbers = [1, 2, 3, 4, 5, 6]
numbers[2...4] = [] // Удаляем элементы с индексами 2-4
// Теперь [1, 2, 6]
// Множественная вставка
var alphabet = ["a", "b", "c", "f", "g"]
alphabet[3...4] = ["d", "e", "f", "g"] // Вставляем недостающие элементы
// Теперь ["a", "b", "c", "d", "e", "f", "g"]
Поддержка пользовательских типов
Массивы также могут иметь custom subscript, если вы расширите их функциональность:
extension Array where Element: Numeric {
subscript(safe index: Int) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
let safeArray = [1, 2, 3]
print(safeArray[safe: 5]) // nil (безопасный доступ)
print(safeArray[safe: 1]) // Optional(2)
Ключевые преимущества такого подхода в Swift включают безопасность доступа по индексу, поддержку сложных операций с диапазонами, эффективную работу с памятью через ArraySlice и выразительный синтаксис, который делает код более читаемым и понятным.