Les applications basées sur Swift fonctionnent-elles sur OS X 10.9 / iOS 7 et inférieur?


616

Les applications basées sur Swift fonctionneront-elles sur OS X 10.9 (Mavericks) / iOS 7 et inférieur?

Par exemple, j'ai une machine exécutant OS X 10.8 (Mountain Lion) et je me demande si une application que j'écris dans Swift fonctionnera dessus.

Ou ce que je devrais avoir pour créer une application Swift sous Mac OS?


51
En supposant que Swift est compilé en un exécutable "normal" et en supposant qu'aucune bibliothèque d'exécution spécifique à Swift n'est requise dans le système d'exploitation, alors oui, il devrait fonctionner sur des systèmes plus anciens. Nous ne savons tout simplement pas encore. Téléchargez Xcode 6 et essayez-le.
rmaddy

12
Une réponse officielle se trouve dans la vidéo sur l'état de l'Union.
Steven Fisher

3
@rmaddy FWIW: lors de la WWDC, dans la présentation de Swift, il était très clairement indiqué que Swift et Objective-C ont le même temps d'exécution.
11684

1
Il est de notoriété publique et a même été mentionné dans le discours d'ouverture qu'il fonctionne sur ces systèmes d'exploitation.
rhummelmose

3
Cette question est celle qui est utilisée comme exemple sur la page de visite .
Donald Duck

Réponses:


520

Je viens de le tester pour vous, les applications Swift se compilent en binaires standard et peuvent être exécutées sur OS X 10.9 et iOS 7.


Application Swift simple utilisée pour les tests:

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
Voir stackoverflow.com/questions/24007050/… - cela entre en conflit avec cette réponse (au moins la partie "ou même inférieure").
rmaddy

14
Je n'ai testé que iOS 7.0 et OS X 10.9. Comme dit dans la réponse.
Leandros

@Leandros En utilisant le mot-clé var, pourquoi devons-nous taper UIViewController deux fois dans cette ligne "var controller: UIViewController = UIViewController ()"? La var n'est-elle pas identique à JavaScript / C # (si non, alors si triste)? S'agit-il d'un casting, mais les types d'objets sont identiques des deux côtés d'un signe égal?
Tien Do

3
@TienDo Je n'ai aucune expérience Swift, mais je suppose que le premier UIViewControlleraprès les deux points représente le type de la variable et la deuxième occurrence après que le =signe appelle le constructeur (initialise la variable).
ComFreek

2
Pour iOS: dans Xcode 6 beta, il y a des cibles de déploiement jusqu'à iOS 6. Je les ai toutes testées, travaillé à trouver. Il y a quelques réponses qui indiquent la même chose.
ySiggen

197

Le code Swift peut être déployé sur OS X 10.9 et iOS 7.0. Il se bloque généralement au lancement sur les anciennes versions du système d'exploitation.


4
Greg, merci d'être venu ici pour répondre aux questions. Pouvez-vous dire un peu ce qui a changé 10.8-> 10.9 et 6.x-> 7.0 qui permet au code généré à partir de Swift de s'exécuter?
Ivan Vučica

20
Swift définit quelques bits dans les métadonnées Objective-C pour marquer les classes Swift. libobjc dans OS X 10.9 et iOS 7.0 a été modifié pour ignorer ces bits en préparation de l'arrivée de Swift. Les anciennes versions du système d'exploitation seront confondues par ces bits.
Greg Parker

9
J'apprécierais BEAUCOUP si Apple envisageait de faire fonctionner les applications Swift sur des plates-formes plus anciennes (au moins à partir d'OSX 10.7). La raison en est que nous avons encore de nombreux clients avec cet OS, donc nous ne pouvons pas commencer à développer avec Swift pendant des années si 10.9 est l'OS minimum supporté!
Mike Lischke

2
@GregParker Y a-t-il une chance que vous puissiez mettre à jour cette réponse pour Swift 2, que les exigences d'exécution aient changé ou non?
Andrey Tarantsov

1
Les cibles de déploiement minimales prises en charge pour les exécutables construits avec Swift restent iOS 7.0 et OSX 10.9. Les API obsolètes dans iOS 7 / OSX 10.9 ou version antérieure ne seront pas disponibles. Lors de la construction, Swift ne prend en charge que le SDK fourni avec Xcode.
Flash Sheridan

103

Apple a annoncé que les applications Swift seront rétrocompatibles avec iOS 7 et OS X Mavericks. L'application WWDC est écrite en Swift.


11
Vraiment WWDC est écrit en Swift ??
Satheeshwaran

7
Oui, l'application WWDCC est écrite en Swift. Comme ils l'ont dit hier.
Shial

22
Jay Freeman affirme le contraire: twitter.com/saurik/status/473785847926374400
Ivan Vučica

2
La tactique de marketing d'Apple est cependant couramment utilisée par les entreprises. Windows a été écrit dans Assembly! Eh bien, seulement le chargeur de démarrage et quelques autres choses, mais il a été écrit en assembleur.
Cole Johnson

4
@ IvanVučica mais 4 classes suffisent pour répondre à la question de compatibilité.
ilya n.

100

Mise à jour - selon Xcode 6 Beta 4

Cible de déploiement minimale pour iOS 7 et OS X 10.9

Le compilateur Swift et Xcode appliquent désormais une cible de déploiement minimale d'iOS 7 ou OS X Mavericks. La définition d'une cible de déploiement antérieure entraîne un échec de génération.

À partir de la version Xcode 6

Donc, ma réponse précédente (illustrée ci-dessous) ne sera applicable à aucun développement ultérieur. Swift ne sera plus disponible pour iOS6 et versions antérieures


Une application Swift peut être exécutée sur iOS 6. Même si beaucoup de gens disent que Swift ne prendra en charge que iOS 7+ et OS X 10.9+, d'après mon expérience, ce n'est pas le cas.

J'ai testé une application simple écrite entièrement en Swift dans un appareil iOS 6. Cela fonctionne parfaitement bien . Comme le dit Apple, le code Swift est compatible binaire avec le code Objective-C. Il utilise le même compilateur et le même runtime pour créer le binaire.

Voici le code que j'ai testé:

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")
    }
}

Il s'agit d'une application simple, ajoutant simplement un bouton par programme. Mon application ne contient que deux fichiers, AppDelegate.swiftet ViewController.swift.

Donc, si vous n'utilisez pas de nouvelles API ajoutées dans le cadre du SDK iOS 8 ou de certaines API spécifiques à Swift (l'API correspondante n'est pas disponible pour Objective-C), votre application fonctionnera de manière transparente sur iOS 6 ou version ultérieure (testée et opérationnelle), même sur iOS 5 (non testé). La plupart des API de Swift ne sont que le remplacement des API Objective-C existantes. En fait, ils sont les mêmes en binaire.

Remarque: Conformément à Xcode 6 beta 4 pour la cible de déploiement d'applications rapides, iOS 7 ou OS X 10.9 (voir la mise à jour ci-dessus). Swift ne sera plus disponible pour iOS6 et versions antérieures



Comme pour les mises à jour précédentes du système, certains frameworks / classes sont abandonnés et doivent être pris en charge sous condition.
Miriam H.

@TienDo Pas besoin de points-virgules :) Même si vous mettez par erreur (c'est une tradition) cela ne sera pas un problème
Anil Varghese

3
Mais vous pouvez toujours utiliser des points-virgules si vous le voulez vraiment. deux déclarations sur une ligne sont séparées par un point
PaulWoodIII

33

En bref:

Les applications basées sur Swift peuvent cibler de nouveau OS X Mavericks ou iOS 7 avec cette même application.

Comment est-ce possible ?

Xcode intègre une petite bibliothèque d'exécution Swift dans le bundle de votre application . Étant donné que la bibliothèque est intégrée, votre application utilise une version cohérente de Swift qui s'exécute sur les versions passées, présentes et futures du système d'exploitation.

Pourquoi devrais-je faire confiance à cette réponse?

Parce que je ne dis pas cette réponse comme un gars de pomme me l'a dit sur Twitter ou j'ai écrit Hello World et l'ai testé.

Je l'ai pris sur le blog des développeurs d'Apple .

vous pouvez donc faire confiance à cela.


2
"petit" prend ~ 20 Mo ou quelque chose. :)
BangOperator

1
Inclure l'intégralité du runtime dans le binaire peut sembler un peu gonflé, mais comme Swift n'est toujours pas complètement stable, il est logique pour eux de permettre aux développeurs de recompiler avec la nouvelle version de Swift en leur temps, plutôt que de mettre à jour une bibliothèque partagée et casser les applications de tout le monde. Une fois que Swift se stabilise, je suppose que le runtime sera stocké avec tout le reste, dans un dylib quelque part.
William T Froggard

@WilliamTFroggard - Ouais, j'espère
Durai Amuthan.H

30

Swift utilise le même runtime qu'Objective-C et peut même vivre côte à côte Objective-C dans la même application (conformément à la keynote de la WWDC 2014).

Cela devra être vérifié / vérifié en utilisant Xcode 6 et le nouveau SDK pour trouver une réponse finale.


1
Il semble que l'utilisation de Xcode Beta 6 vous permettra d'exécuter des applications rapides sur 10.9.3, mais je ne sais pas à quelle distance une application rapide pourra fonctionner, ex 10.7 ou 10.8?
John

22

J'ai lu toutes les réponses qui disaient: Non, Swift ne fonctionne pas avec moins d'iOS 7. Mais j'ai dit OUI , je viens de créer un projet Swift qui s'exécute dans Xcode 5 avec la cible de déploiement 6.0.

  • Je viens de créer un projet de démonstration dans Xcode 6 BETA avec le langage de programmation Swift sélectionné.
  • Fermez Xcode 6 beta et j'ouvre ce projet de démonstration dans Xcode 5 avec la cible de déploiement 6.0
  • Et sélectionnez également le simulateur 6.1 .

Ensuite, ce projet fonctionne bien dans le simulateur 6.1 . Mon Mac OS X est 10.9.3 , donc je l' ai dit oui, qui fonctionne dans plus bas que iOS 7. avec Mac OS X 10.9.3 .

Voici une capture d'écran du simulateur:

Entrez la description de l'image ici

Voici également une démo


3
Question: Sans prise en charge rapide, comment XCode-5 construit la source rapide?
Subin Sebastian

vous pouvez voir la capture d'écran simulatore :) je n'ai pas créé la capture d'écran ci-dessus dans photoshop
Nitin Gohel

je veux dire que j'ai converti une application objective c en rapide et que j'ai des clients qui sont là sur ios 6. Alors, l'application rapide fonctionnera-t-elle?
Maneesh Sharma

vous essayez d'abord avec le code de démonstration si cela fonctionne, alors oui, cela fonctionne définitivement
Nitin Gohel

20

Alors que le code le confirme, Apple lui-même a déclaré que Swift sera compatible sur iOS 7 et Mavericks dans leur discours technique ( État des plates-formes , session 102, autour de la marque des 34 min 00 sec) à la WWDC 2014 .


15

Les applications Swift sont prises en charge sur iOS 7 et supérieur, comme indiqué dans les notes de version Beta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 dans Xcode 6 Beta

Les applications Swift sont prises en charge sur les plates-formes OS X 10.9 et supérieures . OS X 10.4 à 10.10 dans la cible de déploiement. J'ai testé le ciblage de 10,5 à 10,10 et mon exécution sur 10.9.3


1
Je pense que les différentes cibles de déploiement ne sont tout simplement pas encore correctes (XCode 6 est une version bêta). Ce n'est pas parce que vous pouvez sélectionner la valeur que cela fonctionne. J'ai essayé avec OSX 10.7 comme cible et cela n'a pas fonctionné. Notez également qu'une confirmation faisant autorité sur les plateformes a été donnée ci-dessus par Greg Parker.
Mike Lischke

@Mike Lischke, encore une fois, j'ai eu plusieurs tests pour sauvegarder mes arguments. Et je peux exécuter l'application OS X lorsque je sélectionne Deployment Target 10.7. Mais j'apprécie que vous ayez évoqué le fil des supports d'applications OS X.
vladof81

Comment expliquez-vous mes résultats alors? Et qu'en est-il de ce que Greg Parker a écrit? Je serais très heureux si Swift Apps fonctionnerait sur 10.7 mais jusqu'à présent, je n'ai pas vu d'exemple fonctionnel. Bien sûr, je peux également définir 10.7 comme cible de déploiement, mais cela ne fait aucune différence. L'application crahs.
Mike Lischke

@Mike Lischke, avez-vous testé des applications iOS sur des appareils?
vladof81

1
Je l'ai également vu et testé toute la cible de déploiement dans Xcode 6 beta (identique à la réponse). A bien fonctionné en utilisant 2 applications de test différentes.
ySiggen

14

Il semble que les applications Swift ne fonctionnent pas sur OS X 10.7 . Je viens de créer une application graphique simple (une vue, une étiquette, un bouton) qui fonctionne bien sur Mavericks. Le SDK de base est défini sur 10,9 et la cible de déploiement sur 10,7. J'ai copié cette application du dossier DerivedData sur ma machine virtuelle 10.7, et elle se bloque au démarrage, affiche cette erreur:

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
...

Cependant, ce message est irritant, car il y a certainement une bibliothèque CoreGraphics dans cette machine virtuelle. D'autres applications qui font un usage intensif de CoreGraphics fonctionnent très bien.


14

Ceci est le post que j'ai lu sur le blog Apple Swift, pourrait être utile:

Compatibilité des applications :

Si vous écrivez une application Swift, vous pouvez être sûr que votre application fonctionnera bien à l'avenir. En fait, vous pouvez revenir à OS X Mavericks ou iOS 7 avec cette même application. Cela est possible car Xcode intègre une petite bibliothèque d'exécution Swift dans le bundle de votre application. Étant donné que la bibliothèque est intégrée, votre application utilise une version cohérente de Swift qui s'exécute sur les versions passées, présentes et futures du système d'exploitation.

Compatibilité binaire et cadres:

Bien que la compatibilité d'exécution de votre application soit assurée, le langage Swift lui-même continuera d'évoluer et l'interface binaire changera également. Pour être sûr, tous les composants de votre application doivent être construits avec la même version de Xcode et le compilateur Swift pour s'assurer qu'ils fonctionnent ensemble.

Cela signifie que les cadres doivent être gérés avec soin. Par exemple, si votre projet utilise des frameworks pour partager du code avec une extension incorporée, vous souhaiterez construire les frameworks, l'application et les extensions ensemble. Il serait dangereux de s'appuyer sur des cadres binaires qui utilisent Swift - en particulier de tiers. À mesure que Swift change, ces cadres seront incompatibles avec le reste de votre application. Lorsque l'interface binaire se stabilise dans un an ou deux, le runtime Swift fera partie du système d'exploitation hôte et cette limitation n'existera plus.


12

J'ai testé l'exécution d'une application basée sur Swift sur un appareil iPod Touch (3e génération). Il apparaît des applications basées sur Swift ne pas fonctionner avec iOS 5.x mais faire fonctionner avec iOS 6.x.

Voici ce qui apparaît dans le journal de débogage lorsque j'ai essayé de lancer l'application de test avec 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

Pour iOS 6.1.6, l'application fonctionne correctement sans afficher ces messages d'erreur.


12

Il semble y avoir beaucoup d'anciennes réponses ici, donc je voulais juste publier la réponse officielle de l'équipe Swift. Swift est rétrocompatible avec OS X Mavericks et iOS 7

Blog swift des développeurs Apple: Objective-C id as Swift Any

11 juil.2014

Compatibilité

L'une des questions les plus courantes que nous avons entendues à la WWDC était: «Quelle est l'histoire de la compatibilité pour Swift?». Cela semble être un excellent premier sujet.

Compatibilité des applications En termes simples, si vous écrivez une application Swift aujourd'hui et la soumettez à l'App Store cet automne lorsque iOS 8 et OS X Yosemite seront disponibles, vous pouvez être sûr que votre application fonctionnera bien à l'avenir. En fait, vous pouvez revenir à OS X Mavericks ou iOS 7 avec cette même application. Cela est possible car Xcode intègre une petite bibliothèque d'exécution Swift dans le bundle de votre application. Étant donné que la bibliothèque est intégrée, votre application utilise une version cohérente de Swift qui s'exécute sur les versions passées, présentes et futures du système d'exploitation.


11

J'ai également essayé une application très simple sur 10.8 (un bouton, définit le texte sur une étiquette). Il s'est écrasé au démarrage, comme Greg Parker l'a déclaré:

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

(Il s'agissait d'un objectif de déploiement de 10,7)


10

Essayez le code suivant:

Cela fonctionne sans 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
}

Et comment utiliser nav.rootviewcontroller ??
Allan

8

Oui, Apple a en fait annoncé que les applications Swift seront rétrocompatibles avec iOS 7 et OS X Mavericks. De plus, l'application WWDC est écrite dans le langage de programmation Swift.


8

En ce qui concerne les cadres Swift. Comme pour aujourd'hui, avec Xcode version 6.1.1 (6A2008a), si le framework Swift est ciblé sur iOS 7.1, avertissement de rapport de l'éditeur de liens

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

et l'application ne peut pas être soumise à l'AppStore. Vérifiez ce problème: Lint pour empêcher les bibliothèques dynamiques et les cadres de passer avec iOS 7


Swift Framework Mach-O Typedoit être Dynamic Library, cependant, iOS 7 accepte Static Libraryuniquement.
DawnSong

7

Mise à jour rapide, à compter du 15 février 2015 , nous ne pouvons pas soumettre au magasin des applications développées à l'aide d'un SDK avant iOS 8 . Donc, en gardant cela à l'esprit, il vaut mieux ne pas s'inquiéter de ce problème car de nombreuses personnes ont suggéré que les applications créées dans Swift peuvent également être déployées sur OS X 10.9 et iOS 7.0 .


Pourriez-vous nous fournir une source?
Binus

1
Il existe une différence entre le SDK de base et la cible de déploiement. Vous pouvez avoir un SDK de base d' iOS 9 et une cible de déploiement d' iOS 7 et soumettre à iTunes Connect. Downvoting parce que vous n'avez pas fourni de source.
Cœur

1
La documentation Apple actuelle mentionne toujours la prise en charge d'iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
Cœur

1

L'extrait de code répondu posté par Leandros semble un peu ancien. J'ai corrigé et rendu compilable dans 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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.