Что делает атрибут @available в Swift?

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

Ответ

@available — это атрибут, который указывает жизненный цикл и доступность объявления (функции, класса, свойства и т.д.) для конкретных платформ, версий операционных систем или конфигураций сборки. Он помогает управлять совместимостью и информировать разработчиков об изменениях в API.

Основные сценарии использования:

  1. Объявление доступности нового API:

    // Доступно только начиная с iOS 15, macOS 12, и т.д.
    @available(iOS 15, macOS 12.0, *)
    func useNewAsyncAPI() { ... }

    Символ * обязателен и означает "все остальные платформы".

  2. Пометка устаревшего (deprecated) API:

    @available(*, deprecated, message: "Используйте newMethod() вместо этого")
    func oldMethod() { ... }

    Компилятор выдаст предупреждение с указанным сообщением.

  3. Пометка удаленного (obsoleted) API:

    @available(*, obsoleted: 5.0, message: "Удалено в Swift 5.0")
    func removedMethod() { ... }

    Вызов такого кода вызовет ошибку компиляции.

  4. Ограничение доступности (unavailable):

    @available(iOS, unavailable)
    @available(macOS 10.15, *)
    func macOnlyFunction() { ... } // Доступно только на macOS
  5. Указание переименования (renamed):

    @available(*, deprecated, renamed: "NewStructName")
    typealias OldStructName = NewStructName

Проверка доступности во время выполнения: Для условного выполнения кода в зависимости от доступности API используйте #available в условиях:

if #available(iOS 15, *) {
    // Используем API iOS 15+
    useNewAsyncAPI()
} else {
    // Fallback для более ранних версий
    useLegacyAPI()
}

Итог: @available — ключевой инструмент для создания устойчивого, совместимого и хорошо документированного кода, который эволюционирует вместе с платформами.