← Назад к вопросам

Что такое Avaiable?

1.2 Junior🔥 91 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое @available в Swift?

@available — это атрибут компилятора Swift, который позволяет указать информацию о доступности API: с какой версии операционной системы, платформы или Swift он доступен, а также когда он устарел или был удалён. Этот атрибут обеспечивает контроль времени жизни кода и помогает писать безопасный код, учитывающий различия между версиями систем.

Основное назначение @available

  • Объявление доступности API: Указание минимальной версии ОС (iOS, macOS, tvOS, watchOS) или Swift, требуемой для использования класса, метода, свойства или функции.
  • Управление устареванием: Пометка кода как устаревшего (deprecated) или удалённого (unavailable), чтобы предупредить разработчиков о необходимости обновления.
  • Обработка условной компиляции: Позволяет компилятору проверять использование API в зависимости от целевой версии, предотвращая ошибки времени выполнения.

Синтаксис и параметры

Атрибут @available принимает следующие ключевые параметры:

  • iOS, macOS, tvOS, watchOS: Указание версии платформы (например, iOS 13.0).
  • swift: Версия языка Swift.
  • deprecated: Версия, с которой API считается устаревшим (можно добавить сообщение).
  • obsoleted: Версия, в которой API был удалён.
  • unavailable: Помечает API как недоступный на определённой платформе.
  • message: Дополнительное сообщение для предупреждений или ошибок.
  • renamed: Указывает новое имя для API (полезно при рефакторинге).

Примеры использования

1. Объявление доступности для новой функции

@available(iOS 14.0, macOS 11.0, *)
func useNewWidgetAPI() {
    // Код, использующий API, доступное только с iOS 14 и macOS 11
    print("New API is available!")
}

Звёздочка * обязательна и означает, что API доступно на всех других платформах.

2. Пометка кода как устаревшего

@available(iOS, deprecated: 13.0, message: "Use useNewWidgetAPI instead")
func useOldWidgetAPI() {
    print("This API is deprecated!")
}

Компилятор выдаст предупреждение при использовании useOldWidgetAPI в проектах, таргетированных на iOS 13 и выше.

3. Указание недоступности

@available(iOS, unavailable)
func macOSOnlyFunction() {
    // Этот код не скомпилируется на iOS
}

4. Условное выполнение кода с #available

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

if #available(iOS 14.0, *) {
    // Выполнить код только если iOS 14+ доступен
    useNewWidgetAPI()
} else {
    // Fallback для более старых версий
    useOldWidgetAPI()
}

Разница между @available и #available

  • @available: Атрибут времени компиляции, применяется к объявлениям (классам, методам). Контролирует, можно ли использовать API в зависимости от целевой версии.
  • #available: Условие времени выполнения, проверяет версию системы на устройстве. Позволяет писать условные ветки для разных версий ОС.

Практическое значение

  1. Безопасность и совместимость: @available помогает избежать крашей из-за вызовов API, недоступных на старых версиях ОС. Например, при использовании SwiftUI или новых фреймворков (Combine, RealityKit).
  2. Управление жизненным циклом кода: В больших проектах или библиотеках можно плавно выводить старые API, помечая их как deprecated, чтобы дать время разработчикам на миграцию.
  3. Поддержка кросс-платформенных проектов: Позволяет ограничивать код определёнными платформами, если API не универсально.
// Пример комплексного использования
@available(iOS 14.0, macOS 11.0, *)
@available(swift, obsoleted: 5.5, message: "Use async/await instead")
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
    // Устаревший асинхронный код
}

Важные нюансы

  • Обязательность *: В объявлении @available для платформ всегда требуется * (означает "все другие платформы"), чтобы покрыть случаи, когда код может компилироваться для неперечисленных платформ (например, Linux).
  • Приоритеты: Можно комбинировать несколько параметров, но если указано unavailable, это перекрывает другие условия.
  • Влияние на документацию: @available интегрируется с Swift DocC, автоматически отображая информацию о доступности в документации.

В iOS-разработке @available — критически важный инструмент для обеспечения обратной совместимости и адаптации к нововведениям Apple, особенно с ежегодными обновлениями iOS и Swift. Его правильное использование снижает количество багов, связанных с версионностью, и упрощает поддержку приложений для широкого спектра устройств.

Что такое Avaiable? | PrepBro