Работают ли приложения на основе Swift на OS X 10.9 / iOS 7 и ниже?

616

Будут ли приложения на основе Swift работать на OS X 10.9 (Mavericks) / iOS 7 и ниже?

Например, у меня есть машина под управлением OS X 10.8 (Mountain Lion), и мне интересно, будет ли на ней работать приложение, которое я пишу в Swift.

Или что мне нужно, чтобы создать приложение Swift с помощью Mac OS?

Меир
источник
51
Если предположить, что Swift скомпилирован в «нормальный» исполняемый файл и что в ОС нет специальной библиотеки времени исполнения Swift, то да, она должна работать на старых системах. Мы просто еще не знаем. Загрузите Xcode 6 и попробуйте.
rmaddy
12
Официальный ответ будет найден в видео о состоянии Союза.
Стивен Фишер
3
@rmaddy FWIW: на WWDC в презентации Swift наиболее четко было указано, что Swift и Objective-C имеют одинаковое время выполнения.
11684
1
Это общеизвестно и даже упоминалось в программном обеспечении, что оно работает на этих операционных системах.
rhummelmose
3
Этот вопрос используется в качестве примера на странице тура .
Дональд Дак

Ответы:

520

Я только что проверил это для вас, приложения Swift компилируются в стандартные двоичные файлы и могут работать на OS X 10.9 и iOS 7.


Простое приложение Swift, используемое для тестирования:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "I'am a test label"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}
Leandros
источник
13
См. Stackoverflow.com/questions/24007050/… - он конфликтует с этим ответом (по крайней мере, «или даже более низкая» часть).
rmaddy
14
Я тестировал только iOS 7.0 и OS X 10.9. Как сказано в ответе.
Леандрос
@Leandros Используя ключевое слово var, зачем нам два раза набирать UIViewController в этой строке "var controller: UIViewController = UIViewController ()"? Разве var не такой же, как JavaScript / C # (если нет, то так печально)? Является ли это приведением, но типы объектов одинаковы с обеих сторон знака равенства?
Тиен До
3
@TienDo У меня нет опыта работы с Swift, но я полагаю, что первое UIViewControllerпосле двоеточия представляет тип переменной, а второе вхождение после =знака вызывает конструктор (инициализирует переменную).
ComFreek
2
Для iOS: в бета-версии Xcode 6 есть цели развертывания до iOS 6. Я проверил их все, поработал, нашел. Есть несколько ответов о том же.
ySiggen
197

Код Swift можно развернуть в OS X 10.9 и iOS 7.0. Как правило, происходит сбой при запуске на старых версиях ОС.

Грег Паркер
источник
4
Грег, спасибо, что пришли сюда, чтобы ответить на вопросы. Не могли бы вы немного рассказать о том, что изменилось 10.8-> 10.9 и 6.x-> 7.0, что позволяет запускать код, сгенерированный из Swift?
Иван Вучица
20
Swift устанавливает некоторые биты в метаданных Objective C для маркировки классов Swift. libobjc в OS X 10.9 и iOS 7.0 был изменен, чтобы игнорировать эти биты при подготовке к прибытию Swift. Старые версии ОС будут смущены этими битами.
Грег Паркер
9
Я бы НАМНОГО признателен , если компания Apple будет рассмотреть возможность Swift приложения работать на старых платформах тоже (по крайней мере , с OSX 10.7 и выше). Причина в том, что у нас все еще много клиентов с этой ОС, поэтому мы не можем начать разработку с Swift в течение многих лет, если 10,9 является минимально поддерживаемой ОС!
Майк Лишке
2
@GregParker Есть ли шанс, что вы сможете обновить этот ответ для Swift 2, изменились ли требования времени выполнения или нет?
Андрей Таранцов
1
Минимальные поддерживаемые цели развертывания для исполняемых файлов Swift остаются iOS 7.0 и OSX 10.9. API, устаревшие в iOS 7 / OSX 10.9 или более ранних версиях, будут недоступны. При сборке Swift поддерживает только SDK, с которым он поставляется в Xcode.
Флэш Шеридан
103

Apple объявила, что приложения Swift будут обратно совместимы с iOS 7 и OS X Mavericks. Приложение WWDC написано на языке Swift.

Бен Готлиб
источник
11
Неужели WWDC написан на Swift?
Satheeshwaran
7
Да, приложение WWDCC написано на языке Swift. Как они сказали вчера.
Шиал
22
Джей Фриман заявляет об обратном: twitter.com/saurik/status/473785847926374400
Иван Вучица,
2
Маркетинговая тактика Apple является обычной для компаний. Windows была написана на ассемблере! Ну, только загрузчик и некоторые другие вещи, но это было написано в сборке.
Коул Джонсон
4
@ IvanVučica, но 4 класса достаточно, чтобы ответить на вопрос совместимости.
Илья Н.
100

Обновление - согласно Xcode 6 Beta 4

Минимальная цель развертывания iOS 7 и OS X 10.9

Компилятор Swift и Xcode теперь обеспечивают минимальную цель развертывания iOS 7 или OS X Mavericks. Установка более ранней цели развертывания приводит к сбою сборки.

Из примечания к выпуску Xcode 6

Поэтому мой предыдущий ответ (показанный ниже) не будет применим ни к какому дальнейшему развитию. Swift больше не будет доступен для iOS6 и ниже


Приложение Swift можно запустить на iOS 6. Хотя многие говорят, что Swift будет поддерживать только iOS 7+ и OS X 10.9+, по моему опыту это не так.

Я протестировал простое приложение, написанное полностью на Swift, на устройстве iOS 6. Работает отлично . Как говорит Apple, код Swift двоично совместим с кодом Objective-C. Он использует тот же компилятор и среду выполнения для создания двоичного файла.

Вот код, который я протестировал:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
        button.frame = CGRectMake(100, 100, 100, 50)
        button.backgroundColor = UIColor.greenColor()
        button.setTitle("Test Button", forState: UIControlState.Normal)
        button.addTarget(self, action: "buttonTapped:", forControlEvents: UIControlEvents.TouchUpInside)

        self.view.addSubview(button)
    }

    func buttonTapped(sender: UIButton!) {
        println("buttonTapped")
    }
}

Это простое приложение, просто добавление кнопки программно. Мое приложение содержит только два файла, AppDelegate.swiftи ViewController.swift.

Поэтому, если вы не используете какие-либо новые API, добавленные в составе iOS 8 SDK или некоторых специфических API Swift (соответствующий API недоступен для Objective-C), ваше приложение будет бесперебойно работать на iOS 6 или более поздней версии (протестировано и работает), даже на iOS 5 (не тестировалось). Большинство API в Swift являются просто заменой существующих API Objective-C. На самом деле они одинаковы в двоичном виде.

Примечание. В соответствии с бета-версией Xcode 6 для быстрых приложений, целью развертывания должна быть iOS 7 или OS X 10.9 (см. Обновление выше). Так что swift больше не будет доступен для iOS6 и ниже


Анил Варгезе
источник
Так же, как и в предыдущих обновлениях системы, некоторые платформы / классы больше не поддерживаются и должны быть условно поддержаны.
Мириам Х.
@TienDo Не нужно точек с запятой :) Даже если вы ошиблись (это традиция), это не будет проблемой
Анил Варгезе
3
Но вы все еще можете использовать точки с запятой, если вы действительно хотите. два утверждения в одной строке разделяются точкой с запятой
PaulWoodIII
33

Вкратце:

Приложения на основе Swift могут ориентироваться на OS X Mavericks или iOS 7 с тем же приложением.

Как это возможно ?

Xcode встраивает небольшую библиотеку времени выполнения Swift в комплект вашего приложения . Поскольку библиотека встроена, ваше приложение использует согласованную версию Swift, которая работает в прошлых, настоящих и будущих выпусках ОС.

Почему я должен доверять этому ответу?

Потому что я не говорю этот ответ, как сказал мне один твиттер в твиттере, или я написал привет, и проверил его.

Я взял это из блога разработчика Apple .

так что вы можете доверять этому.

Durai Amuthan.H
источник
2
«маленький» занимает ~ 20 мб или что-то. :)
BangOperator
1
Включение всей среды выполнения в двоичный файл может показаться немного раздутым, но поскольку Swift все еще не является полностью стабильным, для них имеет смысл позволить разработчикам перекомпилировать новую версию Swift в свое время, вместо того, чтобы обновлять некоторую общую библиотеку и ломая все приложения. Как только Swift стабилизируется, я предполагаю, что среда выполнения будет храниться вместе со всем остальным, где-то в dylib.
Уильям Т Фроггард
@WilliamTFroggard - Да, надежда на это
Durai Amuthan.H
30

Swift использует ту же среду выполнения, что и Objective-C, и даже может жить рядом с Objective-C в одном и том же приложении (в соответствии с основным докладом WWDC 2014).

Это нужно будет проверить / проверить с помощью Xcode 6 и нового SDK, чтобы найти окончательный ответ.

Крис Питчманн
источник
1
Похоже, что использование Xcode Beta 6 позволит вам запускать быстрые приложения на 10.9.3, но я не уверен, насколько далеко назад сможет работать быстрое приложение, кроме 10.7 или 10.8?
Джон
22

Я прочитал все ответы: «Нет, Swift не работает с менее чем iOS 7. Но я сказал ДА , я только что создал проект Swift, который работает в Xcode 5 с целью развертывания 6.0.

  • Я просто создаю демонстрационный проект в Xcode 6 BETA с выбранным языком программирования Swift.
  • Закройте бета-версию Xcode 6, и я открою этот демонстрационный проект в Xcode 5 с целью развертывания 6.0
  • А также выберите симулятор 6.1 .

Тогда этот проект хорошо работает в симуляторе 6.1 . Мой MacOS X - 10.9.3 , поэтому я сказал «да», он работает ниже iOS 7. с 10.9.3 Mac OS X .

Вот скриншот симулятора:

Введите описание изображения здесь

Вот демо, а также

Нитин Гохель
источник
3
Вопрос: Без быстрой поддержки, как XCode-5 создает быстрый источник?
Субин Себастьян
Вы можете увидеть скриншот simulatore :) я не создал прикрепленный скриншот выше в фотошопе
Nitin Gohel
я имею в виду, что я преобразовал цель c приложением, чтобы быстро и иметь клиентов, которые есть на ios 6. Так будет ли работать приложение swift?
Маниш Шарма
сначала вы попробуете с демо-кодом, если это работает, тогда да, это определенно работает
Нитин Гоэль
20

Хотя код подтверждает это, сама Apple заявляет, что Swift будет совместим с iOS 7 и Mavericks в их техническом выступлении ( Состояние платформ , сеанс 102, около отметки 34 мин 00 с) на WWDC 2014 .

virindh
источник
15

Приложения Swift поддерживаются на iOS 7 и выше, как указано в примечаниях к выпуску Beta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 в Xcode 6 Beta

Приложения Swift поддерживаются на платформах OS X 10.9 и выше . OS X 10.4–10.10 в разделе «Цель развертывания». Я проверил таргетинг с 10.5 до 10.10 и работаю на 10.9.3

vladof81
источник
1
Я думаю, что различные цели развертывания пока не верны (XCode 6 - это бета-версия). То, что вы можете выбрать значение, не означает, что оно работает. Я попытался с OSX 10.7 в качестве цели, и это не сработало. Также отметим, что Грег Паркер (Greg Parker) предоставил авторское подтверждение о платформах.
Майк Лишке
@ Майк Лишке, опять же, у меня было несколько тестов, чтобы подтвердить свои аргументы. И я могу запустить приложение OS X, когда выберу Deployment Target 10.7. Но я ценю, что вы подняли тему поддержки приложений OS X.
vladof81
Как вы объясните мои результаты тогда? А как насчет того, что написал Грег Паркер? Я был бы очень рад, если бы Swift Apps работал на 10.7, но пока я не видел работающего примера. Конечно, я могу установить 10.7 как цель развертывания, но это не имеет значения. Приложение раскручивает.
Майк Лишке
@ Майк Лишке, вы тестировали приложения для iOS на устройствах?
vladof81
1
Я также видел это и проверял все цели развертывания в бета-версии Xcode 6 (так же, как ответ). Работал нормально, используя 2 разных тестовых приложения.
ySiggen
14

Похоже, приложения Swift не работают на OS X 10.7 . Я только что создал простое приложение с графическим интерфейсом (представление, ярлык, кнопка), которое отлично работает на Mavericks. Базовый SDK установлен на 10,9, а цель развертывания - на 10,7. Я скопировал это приложение из папки DerivedData на свою виртуальную машину 10.7, и она зависает при запуске, покажите эту ошибку:

Crashed Thread:  0

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000

Application Specific Information:
dyld: launch, loading dependent libraries

    Dyld Error Message:

  Library not loaded: /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics
  Referenced from: /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/../Frameworks/libswiftAppKit.dylib
  Reason: image not found

Binary Images:
       0x109c65000 -        0x109c6afff +private.Swift-Test (1.0 - 1) <649695D0-58FD-3D02-9176-2D40D4E711F2> /Users/USER/Desktop/Swift-Test.app/Contents/MacOS/Swift-Test
       0x109c83000 -        0x109dbffff +libswift_stdlib_core.dylib (1.0 - 600.0.34.4.5) <10AAC369-9404-321D-A892-49F65856D7AF> /Users/USER/Desktop/Swift-Test.app/Contents/Frameworks/libswift_stdlib_core.dylib
...

Однако это сообщение вызывает раздражение, поскольку в этой виртуальной машине определенно есть библиотека CoreGraphics. Другие приложения, которые интенсивно используют CoreGraphics, работают просто отлично.

Майк Лишке
источник
14

Это пост, который я прочитал в блоге Apple Swift, может быть полезным:

Совместимость приложения :

Если вы напишите приложение Swift, вы можете быть уверены, что ваше приложение будет хорошо работать в будущем. Фактически, вы можете вернуться к OS X Mavericks или iOS 7 с помощью того же приложения. Это возможно, потому что Xcode встраивает небольшую библиотеку времени выполнения Swift в комплект вашего приложения. Поскольку библиотека встроена, ваше приложение использует согласованную версию Swift, которая работает в прошлых, настоящих и будущих выпусках ОС.

Бинарная совместимость и фреймворки:

Несмотря на то, что обеспечивается совместимость приложения во время выполнения, сам язык Swift будет продолжать развиваться, и двоичный интерфейс также будет меняться. На всякий случай все компоненты вашего приложения должны быть собраны с одной и той же версией Xcode и компилятором Swift, чтобы обеспечить их совместную работу.

Это означает, что фреймворки должны тщательно управляться. Например, если ваш проект использует фреймворки для совместного использования кода со встроенным расширением, вы захотите собрать вместе фреймворки, приложения и расширения. Было бы опасно полагаться на двоичные фреймворки, использующие Swift, особенно от третьих лиц. По мере изменения Swift эти фреймворки будут несовместимы с остальной частью вашего приложения. Когда бинарный интерфейс стабилизируется через год или два, среда выполнения Swift станет частью операционной системы хоста, и это ограничение больше не будет существовать.

Ятиша Б.Л.
источник
12

Я протестировал запуск приложения на базе Swift на устройстве iPod Touch (3-го поколения). Оказывается Swift на основе приложения не работать с прошивкой 5.x , но сделать работу с прошивкой 6.x.

Вот что отображается в журнале отладки, когда я пытался запустить тестовое приложение с iOS 5.0.1:

dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftCoreGraphics.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDarwin.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftDispatch.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftFoundation.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftObjectiveC.dylib with errno=1
dyld: F_ADDFILESIGS failed for /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswiftUIKit.dylib with errno=1
dyld: Symbol not found: _OBJC_CLASS_$_NSObject
  Referenced from: /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib
  Expected in: /usr/lib/libobjc.A.dylib
 in /private/var/mobile/Applications/59E31E79-9525-43B0-9DF6-8FEF3C0080F1/SwiftTestApp.app/Frameworks/libswift_stdlib_core.dylib

Для iOS 6.1.6 приложение работает нормально без отображения этих сообщений об ошибках.

Дэвид Х
источник
12

Кажется, здесь много старых ответов, поэтому я просто хотел опубликовать официальный ответ от команды Swift. Swift обратно совместим с OS X Mavericks и iOS 7

Блог разработчика Apple Swift: идентификатор Objective-C - Swift Any

11 июля 2014 г.

Совместимость

Один из самых распространенных вопросов, которые мы услышали на WWDC, был: «Какова история совместимости со Swift?». Это похоже на отличную первую тему.

Совместимость приложений Проще говоря, если вы напишите приложение Swift сегодня и отправите его в App Store этой осенью, когда выйдут iOS 8 и OS X Yosemite, вы можете быть уверены, что ваше приложение будет хорошо работать в будущем. Фактически, вы можете вернуться к OS X Mavericks или iOS 7 с помощью того же приложения. Это возможно, потому что Xcode встраивает небольшую библиотеку времени выполнения Swift в комплект вашего приложения. Поскольку библиотека встроена, ваше приложение использует согласованную версию Swift, которая работает в прошлых, настоящих и будущих выпусках ОС.

Орен
источник
11

Я также попробовал очень простое приложение на 10.8 (одна кнопка, устанавливает текст на этикетке). Он рухнул при запуске, как сказал Грег Паркер:

Dyld Error Message:
  Symbol not found: __dispatch_source_type_memorypressure
  Referenced from: /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib
  Expected in: /usr/lib/libSystem.B.dylib
in /Volumes/*/SwifTest.app/Contents/MacOS/../Frameworks/libswiftDispatch.dylib

(Это было использование цели развертывания 10,7)

Валдар Моридин
источник
10

Попробуйте следующий код:

Это работает без StoryBoard:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window!.backgroundColor = UIColor.whiteColor()

    // Create a nav/vc pair using the custom ViewController class

    let nav = UINavigationController()
    let vc = ViewController(nibName: "ViewController", bundle: nil)

    // Push the vc onto the nav
    nav.pushViewController(vc, animated: false)

    // Set the window’s root view controller
    self.window!.rootViewController = nav

    // Present the window
    self.window!.makeKeyAndVisible()
    return true
}
Premkumar
источник
А как использовать nav.rootviewcontroller ??
Аллан
8

Да, на самом деле Apple объявила, что приложения Swift будут обратно совместимы с iOS 7 и OS X Mavericks. Кроме того, приложение WWDC написано на языке программирования Swift.

Боди Осман
источник
8

Когда дело доходит до Swift Frameworks. На сегодняшний день, с версией Xcode 6.1.1 (6A2008a), если среда Swift предназначена для iOS 7.1, предупреждение о компоновщике

ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.

и приложение не может быть отправлено в AppStore. Проверьте эту проблему: Lint для предотвращения прохождения динамических библиотек и фреймворков с iOS 7

Marcin
источник
Swift Framework Mach-O Typeдолжен быть Dynamic Library, однако, iOS 7 принимает Static Libraryтолько.
DawnSong
7

Быстрое обновление, начиная с 15 февраля 2015 года , мы не можем отправлять в магазин приложения, разработанные с использованием SDK до iOS 8 . Поэтому, помня об этом, лучше не беспокоиться об этой проблеме, так как многие люди полагают, что приложения, созданные в Swift, могут быть развернуты также и на OS X 10.9 и iOS 7.0 .

13-й призрак
источник
Не могли бы вы предоставить нам источник?
Бинус
1
Существует разница между Base SDK и Deployment Target. Вы можете иметь базовый SDK для iOS 9 и цель развертывания для iOS 7 и отправить их в iTunes Connect. Downvoting, потому что вы не предоставили источник.
Cœur
1
В текущей документации Apple по-прежнему упоминается поддержка iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
Cœur,
1

Ответный фрагмент кода, опубликованный Леандросом, кажется старым. Я исправил и сделал его компилируемым в Swift 5.

Swift 5

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let controller = UIViewController()
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
    view.backgroundColor = UIColor.red
    controller.view = view

    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
    label.center = CGPoint(x: 160, y: 284)
    label.textAlignment = NSTextAlignment.center
    label.text = "I'am a test label"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}
Саззад Хисейн Хан
источник