Ответ
@available — это атрибут, который указывает жизненный цикл и доступность объявления (функции, класса, свойства и т.д.) для конкретных платформ, версий операционных систем или конфигураций сборки. Он помогает управлять совместимостью и информировать разработчиков об изменениях в API.
Основные сценарии использования:
-
Объявление доступности нового API:
// Доступно только начиная с iOS 15, macOS 12, и т.д. @available(iOS 15, macOS 12.0, *) func useNewAsyncAPI() { ... }Символ
*обязателен и означает "все остальные платформы". -
Пометка устаревшего (deprecated) API:
@available(*, deprecated, message: "Используйте newMethod() вместо этого") func oldMethod() { ... }Компилятор выдаст предупреждение с указанным сообщением.
-
Пометка удаленного (obsoleted) API:
@available(*, obsoleted: 5.0, message: "Удалено в Swift 5.0") func removedMethod() { ... }Вызов такого кода вызовет ошибку компиляции.
-
Ограничение доступности (unavailable):
@available(iOS, unavailable) @available(macOS 10.15, *) func macOnlyFunction() { ... } // Доступно только на macOS -
Указание переименования (renamed):
@available(*, deprecated, renamed: "NewStructName") typealias OldStructName = NewStructName
Проверка доступности во время выполнения:
Для условного выполнения кода в зависимости от доступности API используйте #available в условиях:
if #available(iOS 15, *) {
// Используем API iOS 15+
useNewAsyncAPI()
} else {
// Fallback для более ранних версий
useLegacyAPI()
}
Итог: @available — ключевой инструмент для создания устойчивого, совместимого и хорошо документированного кода, который эволюционирует вместе с платформами.