Безопасен ли доступ по индексу (subscript) к массиву в Swift?

«Безопасен ли доступ по индексу (subscript) к массиву в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, стандартный доступ по индексу array[index] небезопасен. При попытке обратиться к индексу за пределами диапазона 0..<array.count приложение аварийно завершится с ошибкой Fatal error: Index out of range.

Безопасные альтернативы:

  1. Явная проверка границ:

    if index >= 0 && index < array.count {
        let element = array[index]
    }
  2. Использование свойства indices:

    if array.indices.contains(index) {
        let element = array[index]
    }
  3. Создание безопасного сабскрипта через расширение (наиболее удобный способ):

    extension Array {
        subscript(safe index: Index) -> Element? {
            return indices.contains(index) ? self[index] : nil
        }
    }
    
    // Использование
    let item = array[safe: 5] // Возвращает Element? (nil при невалидном индексе)
  4. Использование высокоуровневых методов: Для многих задач вместо прямого доступа по индексу лучше подходят методы first, last, first(where:), dropFirst(_:) и т.д.

Почему нет встроенной безопасности? Это компромисс между безопасностью и производительностью. Явные проверки делают код надежнее и предотвращают случайные краши.