Est-ce que les applications basées sur Swift fonctionnent sur OS X 10.9 (Mavericks)/iOS 7 et versions antérieures?
Par exemple, j'ai une machine en cours d'exécution OS X 10.8 (Mountain Lion), et je me demande si une application que j'écris dans Swift sera exécutée.
Je viens de le tester pour vous, les applications Swift sont compilées 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
}
Swift code peut être déployé sur OS X 10.9 et iOS 7.0. Il se plantera généralement au lancement sur les anciennes versions du système d'exploitation.
Apple a annoncé que les applications Swift seraient rétrocompatibles avec iOS 7 et OS X Mavericks. L'application WWDC est écrite en Swift.
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 pour iOS 7 ou Mavericks OS X. La définition d'une cible de déploiement antérieure entraîne un échec de la construction.
De la note de version de Xcode 6
Donc, ma réponse précédente (ci-dessous) ne sera pas applicable à un développement ultérieur. Swift ne sera plus disponible pour iOS6 et inférieur
Une application Swift peut être exécutée sur iOS 6. Même si de nombreuses personnes affirment que Swift ne prend 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 entièrement écrite en Swift sur 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")
}
}
C'est une application simple, il suffit d'ajouter un bouton par programmation. Mon application ne contient que deux fichiers, AppDelegate.Swift
et ViewController.Swift
.
Ainsi, si vous n'utilisez pas de nouvelles API ajoutées dans le SDK iOS 8 ou des 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 une version ultérieure (testée et fonctionnelle), 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, la cible de déploiement d'applications Swift doit être iOS 7 ou OS X 10.9 (voir la mise à jour ci-dessus). Donc, Swift ne sera plus disponible pour iOS6 et inférieur
Les applications basées sur Swift peuvent cibler vers OS X Mavericks ou iOS 7 avec cette même application.
Xcode intègre une petite bibliothèque d’exécution Swift dans le bundle de votre application . Comme 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.
Parce que je ne dis pas cette réponse comme un gars d’Apple m’a dit sur Twitter ou j’ai écrit hello world et l’ai testé.
Je l'ai pris de blog de développeur Apple .
afin que vous puissiez avoir confiance en cela.
Swift utilise la même exécution que Objective-C et peut même vivre côte à côte avec Objective-C dans la même application (comme indiqué dans le discours de la WWDC 2014).
Ceci devra être vérifié/vérifié en utilisant Xcode 6 et le nouveau SDK pour trouver une réponse finale.
J'ai lu toutes les réponses disant: Non, Swift ne fonctionne pas avec moins de iOS 7. Mais j'ai dit YES, je viens de créer un projet Swift cela fonctionne dans Xcode 5 avec la cible de déploiement 6.0.
Ensuite, ce projet fonctionne bien dans simulateur 6.1 . Mon MacOS X est 10.9.3 , alors j'ai dit oui, cela fonctionne en dessous de iOS 7. avec 10.9 .3 Mac OS X .
Voici une capture d'écran du simulateur:
Alors que le code le confirme, Apple a lui-même déclaré que Swift serait compatible sur iOS 7 et Mavericks dans leur keynote technique ( État des plates-formes , session 102, autour de la marque 34 min 00 sec) à WWDC 2014 .
Les applications Swift sont prises en charge sur iOS 7 et versions ultérieures comme indiqué dans les notes de publication de la version bêta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 dans Xcode 6 bêta
Les applications Swift sont prises en charge sur les plates-formes OS X 10.9 et ultérieure. OS X 10.4 à 10.10 dans la cible de déploiement. J'ai testé sur le ciblage 10.5 à 10.10, et en cours d'exécution sur 10.9.3
Ceci est le message que j'ai lu sur le blog Apple Swift, pourrait être utile:
Si vous écrivez une application Swift, vous pouvez être assuré que votre application fonctionnera bien à l'avenir. En fait, vous pouvez cibler en arrière sur 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 l'offre de votre application. Comme 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.
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 des raisons de sécurité, tous les composants de votre application doivent être construits avec la même version de Xcode et du compilateur Swift afin de garantir leur compatibilité.
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 intégré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. Au fur et à mesure que Swift change, ces frameworks seront incompatibles avec le reste de votre application. Lorsque l'interface binaire se stabilisera au bout d'un an ou deux, le moteur d'exécution de Swift fera partie du système d'exploitation hôte et cette limitation n'existera plus.
Il semble que les applications Swift ne pas s'exécutent sur OS X 10.7. Je viens de créer une application graphique simple (une vue, une étiquette, un bouton) qui fonctionne très 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 parfaitement.
J'ai testé l'exécution d'une application Swift basée sur Swift sur un périphérique iPod Touch (3e génération). Il semble que les applications basées sur Swift ne fonctionnent pas fonctionnent avec iOS 5.x mais font fonctionnent 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.
Il semble y avoir beaucoup d'anciennes réponses ici, alors je voulais simplement publier la réponse officielle de l'équipe Swift. Swift est rétrocompatible avec OS X Mavericks et iOS 7
Blog Swift pour les développeurs Apple: Objective-C id: Swift Any
11 juil. 2014
Compatibilité
L'une des questions les plus courantes que nous avons entendues à WWDC était la suivante: "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 que vous la soumettez à l'App Store cet automne, lorsque iOS 8 et OS X Yosemite seront disponibles, vous pouvez être assuré que votre application fonctionnera bien dans le futur. En fait, vous pouvez cibler votre OS X Mavericks ou iOS 7 avec la même application. Cela est possible car Xcode intègre une petite bibliothèque d'exécution Swift dans votre le paquet de l'application. Comme 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.
J'ai aussi essayé une application très simple sur 10.8 (un bouton, place le texte sur une étiquette). Il s'est écrasé au démarrage, comme l'a déclaré Greg Parker:
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
(Cela utilisait une cible de déploiement de 10,7)
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
}
En ce qui concerne Swift Frameworks. Pour aujourd'hui, avec Xcode version 6.1.1 (6A2008a), si le cadre Swift est destiné à 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 et les infrastructures dynamiques de passer avec iOS 7
Oui, en fait, Apple a annoncé que les applications Swift seraient rétrocompatibles avec iOS 7 et OS X Mavericks. En outre, l'application WWDC est écrite dans le langage de programmation Swift.
Mise à jour rapide, effective à compter du 15 février 2015, nous ne pouvons pas soumettre au magasin les applications développées à l'aide d'un SDK antérieur à iOS 8. Donc, gardez cela à l'esprit, il vaut mieux ne pas s'inquiéter de ce problème car beaucoup de gens ont suggéré que les applications créées dans Swift puissent également être déployées sur OS X 10.9 et iOS 7..
Extrait de code répond posté par Leandros semble un peu vieux. J'ai corrigé et rendu compilable dans 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
}