Le applicazioni basate su Swift funzionano su OS X 10.9 / iOS 7 e versioni precedenti?


616

Le applicazioni basate su Swift funzionano su OS X 10.9 (Mavericks) / iOS 7 e versioni precedenti?

Ad esempio, ho una macchina che esegue OS X 10.8 (Mountain Lion) e mi chiedo se un'applicazione che scrivo in Swift verrà eseguita su di essa.

O cosa avrei dovuto creare un'applicazione Swift usando Mac OS?


51
Supponendo che Swift sia compilato in un eseguibile "normale" e supponendo che non ci sia alcuna libreria di runtime specifica di Swift necessaria nel sistema operativo, quindi sì, dovrebbe funzionare su sistemi più vecchi. Solo non lo sappiamo ancora. Scarica Xcode 6 e provalo.
rmaddy,

12
Una risposta ufficiale sarà trovata nel video sullo stato dell'Unione.
Steven Fisher,

3
@rmaddy FWIW: al WWDC, nella presentazione di Swift, è stato chiaramente affermato che Swift e Objective-C hanno lo stesso tempo di esecuzione.
11684

1
È di dominio pubblico ed è stato persino menzionato nel keynote che funziona su tali sistemi operativi.
rhummelmose,

3
Questa domanda è quella usata come esempio nella pagina del tour .
Paperino il

Risposte:


520

L'ho appena testato per te, le applicazioni Swift si compongono in binari standard e possono essere eseguite su OS X 10.9 e iOS 7.


Semplice applicazione Swift utilizzata per i test:

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
Vedi stackoverflow.com/questions/24007050/… - è in conflitto con questa risposta (almeno la parte "o anche inferiore").
rmaddy,

14
Ho testato solo iOS 7.0 e OS X 10.9. Come detto nella risposta.
Leandros,

@Leandros Usando la parola chiave var, perché dobbiamo digitare UIViewController due volte in questa riga "var controller: UIViewController = UIViewController ()"? Var non è uguale a JavaScript / C # (se no, quindi così triste)? Questo casting è, ma i tipi di oggetto sono uguali su entrambi i lati del segno uguale?
Tien Do,

3
@TienDo Non ho alcuna esperienza Swift, ma suppongo che il primo UIViewControllerdopo i due punti rappresenti il ​​tipo di variabile e la seconda occorrenza dopo che il =segno chiama il costruttore (inizializza la variabile).
ComFreek,

2
Per iOS: in Xcode 6 beta, ci sono target di distribuzione fino a iOS 6. Li ho testati tutti, ho trovato. Ci sono alcune risposte che confermano lo stesso.
ySiggen,

197

Il codice Swift può essere distribuito su OS X 10.9 e iOS 7.0. Di solito si arresta in modo anomalo all'avvio su versioni precedenti del sistema operativo.


4
Greg, grazie per essere venuto qui per rispondere alle domande. Puoi dirci qualcosa su cosa è cambiato 10.8-> 10.9 e 6.x-> 7.0 che consente l'esecuzione del codice generato da Swift?
Ivan Vučica,

20
Swift imposta alcuni bit nei metadati Objective-C per contrassegnare le classi Swift. libobjc in OS X 10.9 e iOS 7.0 è stato modificato per ignorare questi bit in preparazione all'arrivo di Swift. Le versioni precedenti del sistema operativo verranno confuse da questi bit.
Greg Parker,

9
Sarei MOLTO grato se Apple potrebbe considerare la possibilità di Swift apps lavoro sulle piattaforme più anziani troppo (almeno da OSX 10.7 in poi). Il motivo è che abbiamo ancora molti clienti con questo sistema operativo, quindi non possiamo iniziare a sviluppare con Swift per anni se 10.9 è il sistema operativo minimo supportato!
Mike Lischke,

2
@GregParker Qualche possibilità che tu possa aggiornare questa risposta per Swift 2, indipendentemente dal fatto che i requisiti di runtime siano cambiati o no?
Andrey Tarantsov,

1
Gli obiettivi minimi di distribuzione supportati per gli eseguibili creati da Swift rimangono iOS 7.0 e OSX 10.9. Le API deprecate in iOS 7 / OSX 10.9 o precedenti non saranno disponibili. Durante la creazione, Swift supporta solo l'SDK fornito con Xcode.
Flash Sheridan,

103

Apple ha annunciato che le app Swift saranno retrocompatibili con iOS 7 e OS X Mavericks. L'app WWDC è scritta in Swift.


11
Davvero WWDC è scritto in Swift ??
Satheeshwaran,

7
Sì, l'app WWDCC è scritta in Swift. Come hanno detto ieri.
Shial,

22
Jay Freeman sostiene altrimenti: twitter.com/saurik/status/473785847926374400
Ivan Vučica,

2
Tuttavia, la tattica di marketing di Apple è molto diffusa nelle aziende. Windows è stato scritto in Assembly! Bene, solo il bootloader e alcune altre cose, ma è stato scritto in assembly.
Cole Johnson,

4
@ IvanVučica ma 4 classi sono sufficienti per rispondere alla domanda di compatibilità.
ilya n.

100

Aggiornamento - Secondo Xcode 6 Beta 4

Destinazione minima di distribuzione di iOS 7 e OS X 10.9

Il compilatore Swift e Xcode ora impongono un target di distribuzione minimo di iOS 7 o OS X Mavericks. L'impostazione di una destinazione di distribuzione precedente comporta un errore di compilazione.

Dalla nota di rilascio di Xcode 6

Quindi la mia risposta precedente (mostrata sotto) non sarà applicabile a nessun ulteriore sviluppo. Swift non sarà più disponibile per iOS6 e versioni precedenti


Un'applicazione Swift può essere eseguita su iOS 6. Anche se molte persone dicono che Swift supporterà solo iOS 7+ e OS X 10.9+, per mia esperienza non lo è.

Ho testato una semplice applicazione scritta completamente in Swift in un dispositivo iOS 6. Funziona perfettamente . Come dice Apple, il codice Swift è binario compatibile con il codice Objective-C. Utilizza lo stesso compilatore e runtime per creare il binario.

Ecco il codice che ho testato:

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

È una semplice applicazione, basta aggiungere un pulsante a livello di codice. La mia applicazione contiene solo due file AppDelegate.swifte ViewController.swift.

Pertanto, se non si utilizzano nuove API aggiunte come parte dell'SDK di iOS 8 o alcune API specifiche di Swift (l'API corrispondente non è disponibile per Objective-C), l'applicazione funzionerà perfettamente su iOS 6 o versioni successive (testata e funzionante), anche su iOS 5 (non testato). La maggior parte delle API in Swift sono solo la sostituzione delle API Objective-C esistenti. In effetti sono gli stessi in binario.

Nota: come per Xcode 6 beta 4 per la destinazione di distribuzione di app veloci dovrebbe essere iOS 7 o OS X 10.9 (vedere l'aggiornamento sopra). Quindi swift non sarà più disponibile per iOS6 e precedenti



Come per gli aggiornamenti di sistema precedenti, alcuni framework / classi vengono interrotti e devono essere supportati condizionatamente.
Miriam H.

@TienDo Non c'è bisogno di punti e virgola :) Anche se metti per errore (è una tradizione) che non sarà un problema
Anil Varghese,

3
Ma puoi ancora usare i punti e virgola se vuoi davvero. due dichiarazioni in una riga sono separate da un punto e virgola
PaulWoodIII

33

In breve:

Le applicazioni basate su Swift possono tornare a OS X Mavericks o iOS 7 con la stessa app.

Come è possibile ?

Xcode incorpora una piccola libreria di runtime Swift nel bundle dell'app . Poiché la libreria è incorporata, l'app utilizza una versione coerente di Swift che viene eseguita su versioni del sistema operativo passate, presenti e future.

Perché dovrei fidarmi di questa risposta?

Perché non sto dicendo questa risposta come mi ha detto un tizio su Twitter o ho scritto ciao mondo e l'ho testato.

L'ho preso dal blog degli sviluppatori Apple .

quindi puoi fidarti di questo.


2
"small" richiede ~ 20 mb o qualcosa del genere. :)
BangOperator l'

1
Includere l'intero runtime nel file binario potrebbe sembrare un po 'gonfio, ma poiché Swift non è ancora completamente stabile, ha senso per loro consentire agli sviluppatori di ricompilare con la nuova versione di Swift a loro tempo, piuttosto che aggiornare alcune librerie condivise e rompere le app di tutti. Una volta che Swift si stabilizza, suppongo che il runtime verrà memorizzato insieme a tutto il resto, in un dylib da qualche parte.
William T Froggard,

@WilliamTFroggard - Sì, lo spero
Durai Amuthan.H

30

Swift utilizza lo stesso runtime di Objective-C e può persino vivere parallelamente Objective-C nella stessa applicazione (come nel keynote di WWDC 2014).

Questo dovrà essere verificato / verificato usando Xcode 6 e il nuovo SDK per trovare una risposta finale.


1
Sembra che l'uso di Xcode Beta 6 ti permetta di eseguire app veloci su 10.9.3, ma non sono sicuro di quanto tempo sarà possibile eseguire un'app rapida, ex 10.7 o 10.8?
Giovanni

22

Ho letto tutte le risposte che dicevano: No, Swift non funziona con meno di iOS 7. Ma ho detto , ho appena creato un progetto Swift che viene eseguito in Xcode 5 con destinazione di distribuzione 6.0.

  • Ho appena creato un progetto demo in Xcode 6 BETA con il linguaggio di programmazione Swift selezionato.
  • Chiudi Xcode 6 beta e apro questo progetto demo in Xcode 5 con destinazione di distribuzione 6.0
  • E seleziona anche il simulatore 6.1 .

Quindi quel progetto funziona bene nel simulatore 6.1 . Il mio MacOS X è 10.9.3 , quindi ho detto di sì, che funziona con iOS 7. inferiore con Mac OS X 10.9.3 .

Ecco uno screenshot del simulatore:

Inserisci qui la descrizione dell'immagine

Ecco anche una demo


3
Domanda: Senza supporto rapido come XCode-5 costruisce la fonte rapida?
Sottomarino Sebastian,

puoi vedere lo screenshot del simulatore :) Non ho creato uno screenshot sopra allegato in Photoshop
Nitin Gohel,

Voglio dire, ho convertito un'app c obiettiva in veloce e ho clienti che sono lì su iOS 6. Quindi l'app rapida funzionerà?
Maneesh Sharma,

prima provi con il codice demo se funziona, quindi sì che sicuramente funziona
Nitin Gohel

20

Mentre il codice lo conferma, la stessa Apple ha affermato che Swift sarà compatibile su iOS 7 e Mavericks nel loro keynote tecnico ( Stato delle piattaforme , sessione 102, intorno al 34 min 00 sec) al WWDC 2014 .


15

Le applicazioni Swift sono supportate su iOS 7 e versioni successive come indicato nelle note di rilascio di Beta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 in Xcode 6 Beta

Le applicazioni Swift sono supportate su piattaforme OS X 10.9 e successive . OS X da 10.4 a 10.10 in Destinazione di distribuzione. Ho testato il targeting da 10.5 a 10.10 e in esecuzione su 10.9.3


1
Penso che i vari target di distribuzione non siano ancora corretti (XCode 6 è una beta). Solo perché puoi selezionare il valore non significa che funzioni. Ho provato con OSX 10.7 come destinazione e non ha funzionato. Si noti inoltre che Greg Parker ha dato una conferma autorevole sulle piattaforme.
Mike Lischke,

@Mike Lischke, ancora una volta, ho fatto diversi test per sostenere i miei argomenti. E posso eseguire l'app OS X quando seleziono Deployment Target 10.7. Ma apprezzo il fatto che tu abbia sollevato il thread dei supporti dell'app OS X.
vladof81,

Come spieghi i miei risultati allora? E che dire di ciò che Greg Parker ha scritto? Sarei molto felice se Swift Apps funzionasse su 10.7 ma finora non ho visto un esempio funzionante. Ovviamente posso impostare anche 10.7 come obiettivo di implementazione, ma non fa differenza. L'app fa breccia.
Mike Lischke,

@Mike Lischke, hai testato le app iOS sui dispositivi?
vladof81,

1
L'ho anche visto e testato tutto il target di distribuzione in Xcode 6 beta (uguale alla risposta). Ha funzionato bene utilizzando 2 diverse app di test.
ySiggen,

14

Sembra che le applicazioni Swift non funzionino su OS X 10.7 . Ho appena creato una semplice applicazione GUI (una vista, un'etichetta, un pulsante) che funziona perfettamente su Mavericks. L'SDK di base è impostato su 10.9 e la destinazione di distribuzione su 10.7. Ho copiato quell'applicazione dalla cartella DerivedData sulla mia macchina virtuale 10.7 e si blocca all'avvio, mostra questo errore:

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

Tuttavia, questo messaggio è irritante, poiché in questa VM c'è sicuramente una libreria CoreGraphics. Altre applicazioni che fanno un uso intenso di CoreGraphics funzionano bene.


14

Questo è il post che ho letto dal blog di Apple Swift, potrebbe essere utile:

Compatibilità app :

Se scrivi un'app Swift puoi fidarti che la tua app funzionerà bene in futuro. In effetti, puoi tornare a OS X Mavericks o iOS 7 con la stessa app. Ciò è possibile perché Xcode incorpora una piccola libreria di runtime Swift nel bundle dell'app. Poiché la libreria è incorporata, l'app utilizza una versione coerente di Swift che viene eseguita su versioni del sistema operativo passate, presenti e future.

Compatibilità binaria e frame:

Mentre la compatibilità di runtime della tua app è garantita, il linguaggio Swift stesso continuerà ad evolversi e anche l'interfaccia binaria cambierà. Per sicurezza, tutti i componenti della tua app devono essere creati con la stessa versione di Xcode e il compilatore Swift per assicurarsi che funzionino insieme.

Ciò significa che i quadri devono essere gestiti con cura. Ad esempio, se il progetto utilizza framework per condividere il codice con un'estensione incorporata, vorrai creare insieme framework, app ed estensioni. Sarebbe pericoloso fare affidamento su framework binari che utilizzano Swift, soprattutto di terze parti. Quando Swift cambia, tali framework saranno incompatibili con il resto della tua app. Quando l'interfaccia binaria si stabilizza in un anno o due, il runtime Swift diventerà parte del sistema operativo host e questa limitazione non esisterà più.


12

Ho testato l'esecuzione di un'app bare-bone basata su Swift su un dispositivo iPod Touch (3a generazione). Sembra applicazioni Swift-based non lo fanno il lavoro con iOS 5.x, ma fanno il lavoro con iOS 6.x.

Ecco cosa appare nel registro di debug quando ho provato ad avviare l'app di test con 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

Per iOS 6.1.6, l'app funziona correttamente senza visualizzare quei messaggi di errore.


12

Sembra che ci siano molte vecchie risposte qui, quindi volevo solo pubblicare la risposta ufficiale del team Swift. Swift è retrocompatibile con OS X Mavericks e iOS 7

Blog rapido per sviluppatori Apple: ID Objective-C come Swift Any

11 lug 2014

Compatibilità

Una delle domande più comuni che abbiamo ascoltato al WWDC è stata: "Qual è la storia di compatibilità di Swift?". Questo sembra un ottimo primo argomento.

Compatibilità delle app In poche parole, se scrivi un'app Swift oggi e la invii all'App Store questo autunno quando iOS 8 e OS X Yosemite vengono rilasciati, puoi fidarti che la tua app funzionerà bene in futuro. In effetti, puoi tornare a OS X Mavericks o iOS 7 con la stessa app. Ciò è possibile perché Xcode incorpora una piccola libreria di runtime Swift nel bundle dell'app. Poiché la libreria è incorporata, l'app utilizza una versione coerente di Swift che viene eseguita su versioni del sistema operativo passate, presenti e future.


11

Ho anche provato un'app molto semplice su 10.8 (un pulsante, imposta il testo su un'etichetta). Si è schiantato all'avvio, come ha dichiarato 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

(Questo utilizzava un obiettivo di distribuzione di 10.7)


10

Prova il seguente codice:

Funziona senza 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
}

E come usare nav.rootviewcontroller ??
Allan,

8

Sì, infatti Apple ha annunciato che le app Swift saranno retrocompatibili con iOS 7 e OS X Mavericks. Inoltre, l'app WWDC è scritta nel linguaggio di programmazione Swift.


8

Quando si tratta di Swift Frameworks. Ad oggi, con Xcode versione 6.1.1 (6A2008a), se il framework Swift è indirizzato a iOS 7.1, avviso relativo al linker

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

e la domanda non può essere inviata ad AppStore. Verifica questo problema: Lint per impedire il passaggio di librerie e framework dinamici con iOS 7


Swift Framework Mach-O Typedeve essere Dynamic Library, tuttavia, iOS 7 accetta Static Librarysolo.
DawnSong,

7

Aggiornamento rapido, in vigore dal 15 febbraio 2015 , non è possibile inviare allo store app sviluppate utilizzando un SDK precedente a iOS 8 . Quindi, tenendo presente questo, è meglio non preoccuparsi di questo problema poiché molte persone hanno suggerito che le app realizzate in Swift possono essere distribuite anche su OS X 10.9 e iOS 7.0 .


Ci forniresti una fonte?
Binus,

1
Esiste una differenza tra SDK di base e Target di distribuzione. Puoi avere un SDK di base di iOS 9 e un target di distribuzione di iOS 7 e inviare a iTunes Connect. Downvoting perché non hai fornito una fonte.
Cœur

1
La documentazione Apple attuale menziona ancora il supporto per iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
Cœur

1

Lo snippet di codice inviato da Leandros sembra un po 'vecchio. Ho risolto e reso compilabile in 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.