Работают ли приложения на Swift в OS X 10.9 / iOS 7 и более старых версиях?
Краткий ответ: да, но с ограничениями
Swift-приложения могут работать на OS X 10.9 и iOS 7, но только если вы используете Swift 1.x (первую версию языка). Начиная со Swift 2.0 и выше (то есть с Xcode 7+), Apple прекратила поддержку этих старых ОС. Современные версии Swift (4, 5 и новее) требуют как минимум OS X 10.11 (El Capitan) или iOS 9. Однако есть важные нюансы, которые нужно понимать.
Почему так происходит?
Дело в том, что Swift-приложения не являются полностью нативными в традиционном смысле. Они зависят от встроенной библиотеки Swift runtime (libswiftCore.dylib и других), которая содержит реализации всех базовых типов, протоколов и функций языка. Эта библиотека поставляется вместе с операционной системой, начиная с OS X 10.11 и iOS 9. На более старых системах её нет, и ваше приложение просто не сможет загрузиться — вы получите ошибку вида dyld: Library not loaded.
Как сделать приложение совместимым со старыми ОС?
Если вам критично поддерживать OS X 10.9 или iOS 7, у вас есть два пути:
- Использовать Swift 1.x (Xcode 6). Это старая версия языка с урезанным синтаксисом — нет опциональных цепочек в современном виде, нет
guard,deferи многих других удобств. Ваш код будет выглядеть иначе:
// Swift 1.x стиль
func greet(name: String?) {
if let name = name {
println("Hello, \(name)!")
} else {
println("Hello, stranger!")
}
}
Такой код скомпилируется с Xcode 6 и будет работать на iOS 7 и OS X 10.9. Но вы не сможете использовать современные библиотеки и API.
- Встраивать Swift runtime в своё приложение. Начиная с Xcode 7, Apple позволяет включить опцию "Embed Swift Standard Libraries" в настройках проекта (Build Settings). Если её включить, Xcode скопирует все необходимые .dylib-библиотеки Swift внутрь .app-пакета. Тогда ваше приложение будет содержать всё необходимое для работы и сможет запускаться даже на старых ОС.
Однако есть подвох: Apple официально не рекомендует это делать, и такая сборка не пройдёт проверку в App Store для iOS. Для macOS (Mac App Store) это тоже не приветствуется, но технически возможно при распространении через интернет. Кроме того, размер приложения увеличится на 5–10 МБ.
Практический совет
Если вы пишете новое приложение, лучше ориентироваться на OS X 10.11+ и iOS 9+. Это даст вам доступ к Swift 5, современным API и безопасности. Если же вы поддерживаете legacy-проект, то либо оставайтесь на Swift 1.x, либо переписывайте код на Objective-C для старых версий.
В вашем примере с map и ?? — это синтаксис Swift 2+, поэтому он не заработает на OS X 10.9 без встроенного runtime. Если вы всё же решите встроить библиотеки, проверьте, что deployment target в Xcode выставлен на 10.9, а в Build Settings включена опция Always Embed Swift Standard Libraries.
Альтернативный подход: Objective-C как мост
Если вам нужно поддерживать очень старые ОС (например, iOS 6 или OS X 10.8), Swift вообще не подойдёт — первая версия Swift появилась только в Xcode 6, которая поддерживает iOS 7+. В таких случаях единственный вариант — писать приложение на Objective-C, а затем постепенно переводить его на Swift, начиная с новых версий ОС.
Однако, если ваша целевая аудитория — OS X 10.9 и iOS 7, можно использовать гибридный подход:
- Основной код пишется на Objective-C (он работает на всех версиях).
- Новые модули и фичи, которые не критичны для старых ОС, пишутся на Swift и подключаются через bridging header.
- Для Swift-кода обязательно встраивайте runtime, как описано в первом ответе.
Этот метод позволяет постепенно внедрять Swift, не теряя совместимости. Но помните: чем больше Swift-кода, тем сложнее будет поддерживать старые версии ОС. Лучшая стратегия — установить минимальную версию ОС на iOS 9+ и macOS 10.11+ и использовать чистый Swift без оглядки на прошлое.