Чи працюють програми на базі Swift на ОС X 10.9 / iOS 7 і новіших версій?


616

Чи працюватимуть програми на базі Swift на OS X 10.9 (Mavericks) / iOS 7 та новіших версій?

Наприклад, у мене є машина, на якій працює ОС 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
}

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 можна розгорнути в ОС 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 було змінено, щоб ігнорувати ці біти під час підготовки до прибуття Свіфта. Старіші версії ОС будуть переплутані цими бітами.
Грег Паркер

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 API Swift (відповідний API недоступний для Objective-C), ваш додаток буде безперебійно працювати на iOS 6 або пізнішій версії (перевірено та працює), навіть на iOS 5 (не тестується). Більшість API в Swift - це лише заміна існуючих API-програм Objective-C. Насправді вони однакові у бінарному.

Примітка: Відповідно до Xcode 6 beta 4 для швидкого розгортання додатків має бути iOS 7 або OS X 10.9 (див. Вище оновлення). Таким чином, швидкий більше не буде доступний для iOS6 та нижче



Так само, як і попередні оновлення системи, деякі рамки / класи припиняються і їх потрібно умовно підтримувати.
Міріам Х.

@TienDo Не потрібні крапки з комою :) Навіть якщо ви помилково ставите (це традиція), що не буде проблемою
Аніл Варгезе

3
Але ви все одно можете використовувати крапки з комою, якщо дуже хочете. два твердження в одному рядку розділені крапкою з комою
PaulWoodIII

33

Коротко:

Швидкі додатки можуть орієнтуватися на OS X Mavericks або iOS 7 із цим самим додатком.

Як це можливо?

Xcode вбудовує невелику бібліотеку виконання Swift в комплект програми . Оскільки бібліотека вбудована, ваш додаток використовує послідовну версію Swift, яка працює на минулих, теперішніх та майбутніх випусках ОС.

Чому я повинен довіряти цій відповіді?

Тому що я не говорю цієї відповіді, як один хлопець з яблук сказав мені у твіттері, або я написав привіт світу і перевірив його.

Я взяв це з блогу розробників яблук .

тож ви можете довіряти цьому.


2
"малий" займає ~ 20 мб або щось. :)
BangOperator

1
Включення всього часу виконання у бінарний файл може здатися трохи роздутим, але оскільки Swift все ще не є повністю стабільним, для них є сенс дозволити розробникам перекомпілювати нову версію Swift у свій час, а не оновлювати якусь спільну бібліотеку та зламати всі програми. Як тільки Свіфт стабілізується, я припускаю, що час виконання буде зберігатися поряд із усім іншим, у дилібі десь.
Вільям Т Фроггард

@WilliamTFroggard - Так, сподіваюся,
Дурай Амутхан.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 є , таким чином , я сказав так, що працює в нижче прошивці 7. з 10.9.3 Mac OS X .

Ось це скріншот тренажера:

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

Ось і демонстрація


3
Питання: Без швидкої підтримки, як XCode-5 будує швидке джерело?
Субін Себастьян

ви можете побачити скріншот simulatore :) Я не створив прикріплений знімок екрана у фотошопі
Нітін Гохель,

я маю на увазі, що я перетворив об'єктивну програму c, щоб швидко і мав клієнтів, які перебувають там на ios 6. Так буде працювати швидке додаток?
Манееш Шарма

спочатку ви спробуйте демо-код, якщо це працює, то так, що definaty працює
Нітін Гохель,

20

Хоча код і підтверджує це, компанія Apple заявила, що Swift буде сумісним на iOS 7 та Mavericks в технічній програмі ( стан платформ , сесія 102, близько 34 хв. 00 сек.) На WWDC 2014 .


15

Швидкі програми підтримуються на iOS 7 і вище, як зазначено в примітках до випуску Beta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 в Xcode 6 Beta

Швидкі програми підтримуються на платформах OS X 10.9 і вище . ОС X 10.4 до 10.10 в цілі розгортання. Я перевірив націлювання від 10,5 до 10,10 і працює на 10,9,3


1
Я думаю, що різні цілі розгортання просто ще не правильні (XCode 6 - бета-версія). Тільки тому, що ви можете вибрати значення, не означає, що воно працює. Я спробував з OSX 10.7 як мішень, і це не спрацювало. Також зауважте, що Грег Паркер вище дав авторське підтвердження щодо платформ.
Майк Лішке

@Mike Lischke, знову ж таки, у мене було кілька тестів на підтвердження аргументів. І я можу запускати додаток OS X, коли вибираю ціль розгортання 10.7. Але я вдячний, що ви підняли нитку підтримок програм для OS X.
vladof81

Як ви пояснюєте мої результати тоді? А як щодо того, що написав Грег Паркер? Я був би дуже радий, якби Swift Apps працював на 10.7, але поки що я не бачив діючого прикладу. Звичайно, я також можу встановити 10.7 як ціль розгортання, але це не має значення. Додаток скачується.
Майк Лішке

@Mike Lischke, ви протестували додатки iOS на пристроях?
vladof81

1
Я також бачив це і перевіряв всю ціль розгортання в бета-версії Xcode 6 (те саме, що відповідь). Чудово працював за допомогою двох різних тестових програм.
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: ідентифікатор 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
}

А як користуватися 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


Проте, Swift Framework Mach-O Typeмає бути Dynamic Library, iOS 7 приймає Static Libraryлише.
Світанок

7

Швидке оновлення, яке діє з 15 лютого 2015 року , ми не можемо надсилати додатки до магазину, розроблені за допомогою SDK до iOS 8 . Отже, маючи це на увазі, краще не турбуватися з цього приводу, оскільки багато людей припустили, що програми, створені в Swift, також можуть бути розгорнуті в ОС X 10.9 та iOS 7.0 .


Ви б подали нам джерело?
Бінус

1
Існує різниця між базовим SDK і цільовим розміщенням. Ви можете мати базовий SDK iOS 9 та ціль розгортання iOS 7 та подати в iTunes Connect. Відхилення, тому що ви не вказали джерело.
Cœur

1
У поточній документації Apple все ще згадується підтримка iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
Cœur

1

У відповідь фрагмент коду, опублікований Леандросом, здається, трохи застарілий. Я виправив і зробив це комбінованим у Swift 5.

Швидкий 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.