¿Las aplicaciones basadas en Swift funcionan en OS X 10.9 / iOS 7 y versiones anteriores?

616

¿Funcionarán las aplicaciones basadas en Swift en OS X 10.9 (Mavericks) / iOS 7 y versiones anteriores?

Por ejemplo, tengo una máquina que ejecuta OS X 10.8 (Mountain Lion), y me pregunto si una aplicación que escribo en Swift se ejecutará en ella.

¿O qué debería tener para crear una aplicación Swift con Mac OS?

MeIr
fuente
51
Suponiendo que Swift se compila en un ejecutable "normal" y suponiendo que no se necesita una biblioteca de tiempo de ejecución específica de Swift en el sistema operativo, entonces sí, debería ejecutarse en sistemas más antiguos. Simplemente no lo sabemos todavía. Descarga Xcode 6 y pruébalo.
rmaddy
12
Se encontrará una respuesta oficial en el video del Estado de la Unión.
Steven Fisher
3
@rmaddy FWIW: en la WWDC, en la presentación de Swift se afirmó más claramente que Swift y Objective-C tienen el mismo tiempo de ejecución.
11684
1
Es de conocimiento público e incluso se mencionó en la nota clave que se ejecuta en esos sistemas operativos.
rhummelmose
3
Esta pregunta es la que se usa como ejemplo en la página del recorrido .
Pato Donald el

Respuestas:

520

Lo acabo de probar para usted, las aplicaciones Swift se compilan en binarios estándar y se pueden ejecutar en OS X 10.9 e iOS 7.


Aplicación Swift simple utilizada para pruebas:

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
fuente
13
Consulte stackoverflow.com/questions/24007050/… : entra en conflicto con esta respuesta (al menos la parte "o incluso más baja").
rmaddy
14
Solo he probado iOS 7.0 y OS X 10.9. Como se dijo en la respuesta.
Leandros
@Leandros Al usar la palabra clave var, ¿por qué necesitamos escribir UIViewController dos veces en esta línea "controlador var: UIViewController = UIViewController ()"? ¿Var no es lo mismo que JavaScript / C # (si no, entonces es muy triste)? ¿Es este lanzamiento, pero los tipos de objeto son los mismos en ambos lados del signo igual?
Tien Do
3
@TienDo No tengo ninguna experiencia Swift, pero supongo que la primera UIViewControllerdespués de los dos puntos representa el tipo de la variable y la segunda aparición después de que el =signo llama al constructor (inicializa la variable).
ComFreek
2
Para iOS: en Xcode 6 beta, hay objetivos de implementación hasta iOS 6. Los probé todos, trabajé para encontrarlos. Hay algunas respuestas que dicen lo mismo.
ySiggen
197

El código Swift se puede implementar en OS X 10.9 e iOS 7.0. Por lo general, se bloqueará en el lanzamiento en versiones anteriores del sistema operativo.

Greg Parker
fuente
44
Greg, gracias por venir aquí para responder preguntas. ¿Puedes decir un poco sobre lo que cambió 10.8-> 10.9 y 6.x-> 7.0 que permite que se ejecute el código generado por Swift?
Ivan Vučica
20
Swift establece algunos bits en los metadatos de Objective-C para marcar las clases de Swift. libobjc en OS X 10.9 e iOS 7.0 se cambió para ignorar estos bits en preparación para la llegada de Swift. Las versiones anteriores del sistema operativo se confundirán con estos bits.
Greg Parker
99
Me mucho aprecio si Apple podría considerar la posibilidad de Swift Las aplicaciones funcionan en plataformas mayores también (al menos desde OSX 10.7 en adelante). La razón es que todavía tenemos muchos clientes con este sistema operativo, por lo que no podemos comenzar a desarrollar con Swift durante años si 10.9 es el sistema operativo mínimo admitido.
Mike Lischke
2
@GregParker ¿Hay alguna posibilidad de que pueda actualizar esta respuesta para Swift 2, si los requisitos de tiempo de ejecución han cambiado o no?
Andrey Tarantsov
1
Los objetivos mínimos de implementación compatibles para los ejecutables construidos por Swift siguen siendo iOS 7.0 y OSX 10.9. Las API en desuso en iOS 7 / OSX 10.9 o anterior no estarán disponibles. Al construir, Swift solo admite el SDK con el que se envía en Xcode.
Flash Sheridan
103

Apple ha anunciado que las aplicaciones Swift serán compatibles con iOS 7 y OS X Mavericks. La aplicación WWDC está escrita en Swift.

Ben Gottlieb
fuente
11
Realmente WWDC está escrito en Swift?
Satheeshwaran
77
Sí, la aplicación WWDCC está escrita en Swift. Como dijeron ayer.
Shial
22
Jay Freeman afirma lo contrario: twitter.com/saurik/status/473785847926374400
Ivan Vučica
2
Sin embargo, la táctica de marketing de Apple es común en las empresas. Windows fue escrito en la Asamblea! Bueno, solo el gestor de arranque y algunas otras cosas, pero fue escrito en ensamblador.
Cole Johnson
44
@ IvanVučica pero 4 clases son suficientes para responder la pregunta de compatibilidad.
ilya n.
100

Actualización: según Xcode 6 Beta 4

Objetivo de implementación mínima de iOS 7 y OS X 10.9

El compilador Swift y Xcode ahora imponen un objetivo de implementación mínimo de iOS 7 u OS X Mavericks. Establecer un objetivo de implementación anterior resulta en un error de compilación.

De la nota de lanzamiento de Xcode 6

Por lo tanto, mi respuesta anterior (mostrada a continuación) no será aplicable a ningún desarrollo posterior. Swift ya no estará disponible para iOS6 y versiones inferiores


Una aplicación Swift se puede ejecutar en iOS 6. Aunque muchas personas dicen que Swift solo admitirá iOS 7+ y OS X 10.9+, desde mi experiencia no lo es.

He probado una aplicación simple escrita completamente en Swift en un dispositivo iOS 6. Funciona perfectamente bien . Como dice Apple, el código Swift es binario compatible con el código Objective-C. Utiliza el mismo compilador y tiempo de ejecución para crear el binario.

Aquí está el código que he probado:

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

Es una aplicación simple, solo agrega un botón mediante programación. Mi aplicación contiene solo dos archivos AppDelegate.swifty ViewController.swift.

Entonces, si no está utilizando ninguna nueva API agregada como parte del SDK de iOS 8 o algunas API específicas de Swift (la API correspondiente no está disponible para Objective-C), su aplicación funcionará sin problemas en iOS 6 o posterior (probado y funcionando), incluso en iOS 5 (no probado). La mayoría de las API en Swift son solo el reemplazo de las API existentes de Objective-C. De hecho, son lo mismo en binario.

Nota: Según Xcode 6 beta 4 para el objetivo de implementación de aplicaciones rápidas, debe ser iOS 7 u OS X 10.9 (consulte la actualización anterior). Así que Swift ya no estará disponible para iOS6 y versiones inferiores


Anil Varghese
fuente
Al igual que las actualizaciones anteriores del sistema, algunos marcos / clases se suspenden y deben ser compatibles condicionalmente.
Miriam H.
@TienDo No hay necesidad de punto y coma :) Incluso si cometes por error (es una tradición) eso no será un problema
Anil Varghese
3
Pero aún puede usar punto y coma si realmente lo desea. dos declaraciones en una línea están separadas por punto y coma
PaulWoodIII
33

En breve:

Las aplicaciones basadas en Swift pueden dirigirse de nuevo a OS X Mavericks o iOS 7 con esa misma aplicación.

Como es posible ?

Xcode incorpora una pequeña biblioteca de tiempo de ejecución Swift dentro del paquete de su aplicación . Debido a que la biblioteca está incrustada, su aplicación utiliza una versión consistente de Swift que se ejecuta en versiones pasadas, presentes y futuras del sistema operativo.

¿Por qué debería confiar en esta respuesta?

Porque no estoy diciendo esta respuesta como me dijo un chico de Apple en Twitter o escribí hola mundo y lo probé.

Lo tomé del blog de desarrolladores de Apple .

para que puedas confiar en esto.

Durai Amuthan.H
fuente
2
"pequeño" toma ~ 20 mb o algo así. :)
BangOperator
1
Incluir todo el tiempo de ejecución en el binario puede parecer un poco inflado, pero debido a que Swift todavía no es completamente estable, tiene sentido para ellos permitir que los desarrolladores recompilen con la nueva versión de Swift en su propio tiempo, en lugar de actualizar alguna biblioteca compartida y rompiendo las aplicaciones de todos. Una vez que Swift se estabilice, supongo que el tiempo de ejecución se almacenará junto con todo lo demás, en un dylib en alguna parte.
William T Froggard
@WilliamTFroggard - Sí, eso espero
Durai Amuthan.H
30

Swift usa el mismo tiempo de ejecución que Objective-C e incluso puede vivir lado a lado Objective-C en la misma aplicación (según la nota clave de WWDC 2014).

Esto deberá verificarse / verificarse utilizando Xcode 6 y el nuevo SDK para encontrar una respuesta final.

Chris Pietschmann
fuente
1
Parece que usar Xcode Beta 6 le permitirá ejecutar aplicaciones rápidas en 10.9.3, pero no estoy seguro de qué tan atrás podrá ejecutarse una aplicación rápida, por ejemplo, 10.7 o 10.8.
John
22

Leí todas las respuestas que decían: No, Swift no funciona con menos de iOS 7. Pero dije , acabo de crear un proyecto Swift que se ejecuta en Xcode 5 con un objetivo de implementación 6.0.

  • Acabo de crear un proyecto de demostración en Xcode 6 BETA con el lenguaje de programación Swift seleccionado.
  • Cierre Xcode 6 beta, y abro este proyecto de demostración en Xcode 5 con destino de implementación 6.0
  • Y también seleccione simulador 6.1 .

Entonces ese proyecto funciona bien en el simulador 6.1 . Mi MacOS X es 10.9.3 , así que dije que sí, que se ejecuta en una versión inferior a iOS 7. con 10.9.3 Mac OS X .

Aquí hay una captura de pantalla del simulador:

Ingrese la descripción de la imagen aquí

Aquí hay una demostración también

Nitin Gohel
fuente
3
Pregunta: Sin soporte rápido, ¿cómo XCode-5 construye la fuente rápida?
Subin Sebastian
puedes ver la captura de pantalla de simulatore :) no
creé la
Me refiero a que he convertido una aplicación de Objective C a Swift y tengo clientes que están allí en iOS 6. Entonces, ¿funcionará la aplicación Swift?
Maneesh Sharma
primero intente con el código de demostración si eso funciona, entonces sí, definitivamente funciona
Nitin Gohel
20

Si bien el código lo confirma, la propia Apple ha dicho que Swift será compatible con iOS 7 y Mavericks en su nota técnica ( Estado de las plataformas , sesión 102, alrededor de la marca de 34 min 00 segundos) en WWDC 2014 .

virindh
fuente
15

Las aplicaciones Swift son compatibles con iOS 7 y superior como se indica en las notas de la versión Beta 4. iOS 6.0, 6.1, 7.0, 7.1, 8.0 en Xcode 6 Beta

Las aplicaciones Swift son compatibles con las plataformas OS X 10.9 y superiores . OS X 10.4 a 10.10 en Destino de implementación. He probado en la orientación de 10.5 a 10.10, y en 10.9.3

vladof81
fuente
1
Creo que los diversos objetivos de implementación aún no son correctos (XCode 6 es una versión beta). El hecho de que pueda seleccionar el valor no significa que funcione. Intenté con OSX 10.7 como objetivo y no funcionó. También tenga en cuenta que Greg Parker ha dado una confirmación automática sobre plataformas.
Mike Lischke
@ Mike Lischke, nuevamente, tuve varias pruebas para respaldar mis argumentos. Y puedo ejecutar la aplicación OS X cuando selecciono Destino de implementación 10.7. Pero aprecio que hayas mencionado el hilo de las aplicaciones OS X.
vladof81
¿Cómo explicas mis resultados entonces? ¿Y qué hay de lo que escribió Greg Parker? Estaría muy feliz si Swift Apps funcionara en 10.7, pero hasta ahora no he visto un ejemplo que funcione. Por supuesto, también puedo establecer 10.7 como objetivo de implementación, pero no hace la diferencia. La aplicación crahs.
Mike Lischke
@ Mike Lischke, ¿probaste aplicaciones iOS en dispositivos?
vladof81
1
También lo vi y probé todo el objetivo de implementación en Xcode 6 beta (igual que la respuesta). Funcionó bien usando 2 aplicaciones de prueba diferentes.
ySiggen
14

Parece que las aplicaciones Swift no se ejecutan en OS X 10.7 . Acabo de crear una aplicación GUI simple (una vista, una etiqueta, un botón) que funciona bien en Mavericks. El SDK base se establece en 10.9 y el objetivo de implementación en 10.7. Copié esa aplicación desde la carpeta DerivedData a mi máquina virtual 10.7, y se bloquea al iniciar, muestra este error:

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

Sin embargo, este mensaje es irritante, ya que ciertamente hay una biblioteca CoreGraphics en esta VM. Otras aplicaciones que hacen un uso intensivo de CoreGraphics funcionan bien.

Mike Lischke
fuente
14

Esta es la publicación que leí del blog de Apple Swift, podría ser útil:

Compatibilidad de aplicaciones :

Si escribe una aplicación Swift, puede confiar en que su aplicación funcionará bien en el futuro. De hecho, puede volver a apuntar a OS X Mavericks o iOS 7 con esa misma aplicación. Esto es posible porque Xcode incorpora una pequeña biblioteca de tiempo de ejecución Swift dentro del paquete de su aplicación. Debido a que la biblioteca está incrustada, su aplicación utiliza una versión consistente de Swift que se ejecuta en versiones pasadas, presentes y futuras del sistema operativo.

Compatibilidad binaria y marcos:

Si bien la compatibilidad de tiempo de ejecución de su aplicación está asegurada, el lenguaje Swift seguirá evolucionando y la interfaz binaria también cambiará. Para estar seguro, todos los componentes de su aplicación deben construirse con la misma versión de Xcode y el compilador Swift para garantizar que funcionen juntos.

Esto significa que los marcos deben gestionarse con cuidado. Por ejemplo, si su proyecto usa marcos para compartir código con una extensión incrustada, querrá construir los marcos, la aplicación y las extensiones juntos. Sería peligroso confiar en marcos binarios que usan Swift, especialmente de terceros. A medida que Swift cambia, esos marcos serán incompatibles con el resto de su aplicación. Cuando la interfaz binaria se estabiliza en uno o dos años, el tiempo de ejecución Swift se convertirá en parte del sistema operativo host y esta limitación ya no existirá.

Yatheesha BL
fuente
12

Probé con una aplicación basada en Swift en un dispositivo iPod Touch (tercera generación). Parece que las aplicaciones basadas en Swift no funcionan con iOS 5.x, pero con iOS 6.x.

Esto es lo que aparece en el registro de depuración cuando intenté iniciar la aplicación de prueba 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

Para iOS 6.1.6, la aplicación funciona bien sin mostrar esos mensajes de error.

David H
fuente
12

Parece que hay muchas respuestas antiguas aquí, así que solo quería publicar la respuesta oficial del equipo Swift. Swift es compatible con versiones anteriores de OS X Mavericks y iOS 7

Blog rápido de desarrolladores de Apple: Id. De Objective-C como Swift Any

11 de julio de 2014

Compatibilidad

Una de las preguntas más comunes que escuchamos en WWDC fue: "¿Cuál es la historia de compatibilidad para Swift?". Este parece ser un gran primer tema.

Compatibilidad de aplicaciones En pocas palabras, si escribe una aplicación Swift hoy y la envía a la App Store este otoño cuando se lanzan iOS 8 y OS X Yosemite, puede confiar en que su aplicación funcionará bien en el futuro. De hecho, puede volver a apuntar a OS X Mavericks o iOS 7 con esa misma aplicación. Esto es posible porque Xcode incorpora una pequeña biblioteca de tiempo de ejecución Swift dentro del paquete de su aplicación. Debido a que la biblioteca está incrustada, su aplicación utiliza una versión consistente de Swift que se ejecuta en versiones pasadas, presentes y futuras del sistema operativo.

Oren
fuente
11

También probé una aplicación muy simple en 10.8 (un botón, establece el texto en una etiqueta). Se bloqueó en el inicio, como Greg Parker declaró:

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

(Esto estaba usando un objetivo de implementación de 10.7)

Valdar Moridin
fuente
10

Prueba el siguiente código:

Funciona sin 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
fuente
¿Y cómo usar nav.rootviewcontroller?
Allan
8

Sí, de hecho, Apple ha anunciado que las aplicaciones Swift serán compatibles con iOS 7 y OS X Mavericks. Además, la aplicación WWDC está escrita en el lenguaje de programación Swift.

Bodi Osman
fuente
8

Cuando se trata de marcos rápidos. En cuanto a hoy, con Xcode versión 6.1.1 (6A2008a), si el marco Swift está dirigido a iOS 7.1, advertencia de informe de enlace

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

y la aplicación no se puede enviar a AppStore. Verifique este problema: Lint para evitar que las bibliotecas dinámicas y los marcos pasen con iOS 7

Marcin
fuente
Swift Framework Mach-O Typedebe ser Dynamic Library, sin embargo, iOS 7 Static Librarysolo acepta .
DawnSong
7

Actualización rápida, vigente a partir del 15 de febrero de 2015 , no podemos enviar aplicaciones a la tienda que se desarrollaron utilizando un SDK anterior a iOS 8 . Entonces, teniendo esto en cuenta, es mejor no preocuparse por este problema, ya que muchas personas han sugerido que las aplicaciones creadas en Swift también se pueden implementar en OS X 10.9 e iOS 7.0 .

13 ° fantasma
fuente
¿Nos proporcionarías una fuente?
Binus
1
Hay una diferencia entre Base SDK y Destino de implementación. Puede tener un SDK base de iOS 9 y un objetivo de implementación de iOS 7 y enviarlo a iTunes Connect. Votación negativa porque no proporcionó una fuente.
Coeur
1
La documentación actual de Apple todavía menciona el soporte para iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
Cœur
1

El fragmento de código respondido publicado por Leandros parece un poco viejo. Lo arreglé y lo hice compilable en 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
}
Sazzad Hissain Khan
fuente