Что такое ключевое слово throws в Swift?

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

Ответ

Ключевое слово throws в Swift указывает, что функция или метод может выбросить ошибку во время выполнения. Оно используется для обработки исключительных ситуаций, когда операция может завершиться неудачно (например, сетевая ошибка, парсинг данных).

Основные принципы:

  • Функция с throws объявляет, что она может выбросить ошибку.
  • Вызывающий код обязан обработать возможную ошибку с помощью do-try-catch, try? или try!.
  • Выбрасываемые ошибки должны соответствовать протоколу Error.

Пример объявления и вызова:

// 1. Определение ошибки
enum NetworkError: Error {
    case invalidURL
    case requestFailed(statusCode: Int)
}

// 2. Функция, которая может выбросить ошибку
func fetchData(from urlString: String) throws -> Data {
    guard let url = URL(string: urlString) else {
        throw NetworkError.invalidURL
    }
    // ... выполнение запроса
    let (data, response) = try await URLSession.shared.data(from: url)
    guard let httpResponse = response as? HTTPURLResponse,
          (200...299).contains(httpResponse.statusCode) else {
        throw NetworkError.requestFailed(statusCode: (response as? HTTPURLResponse)?.statusCode ?? 0)
    }
    return data
}

// 3. Обработка ошибки при вызове
func loadUserData() {
    do {
        let data = try fetchData(from: "https://api.example.com/user")
        // Обработка успешного результата
        parse(data)
    } catch NetworkError.invalidURL {
        print("Ошибка: неверный URL.")
    } catch NetworkError.requestFailed(let code) {
        print("Ошибка сети с кодом: (code).")
    } catch {
        print("Неизвестная ошибка: (error).")
    }
}

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

  • try? — преобразует результат в опционал. При ошибке возвращает nil.
    if let data = try? fetchData(from: urlString) { /* успех */ }
  • try! — принудительное извлечение. Вызовет краш при ошибке. Используйте только когда уверены, что ошибки не произойдет.
    let data = try! fetchData(from: guaranteedValidURL) // Рискованно

Использование throws делает поток ошибок явным и проверяемым компилятором, что повышает надежность кода.