629

Will Swift-based applications work on OS X 10.9 (Mavericks)/iOS 7 and lower?

For example, I have a machine running OS X 10.8 (Mountain Lion), and I am wondering if an application I write in Swift will run on it.

Or what should I have to create a Swift application using Mac OS?

9
  • 51
    Assuming Swift is compiled into a "normal" executable and assuming there is no Swift specific runtime library needed in the OS, then yes, it should run on older systems. We just don't know yet. Download Xcode 6 and try it.
    – rmaddy
    Commented Jun 2, 2014 at 19:33
  • 12
    An official answer will be found in the State of the Union video. Commented Jun 2, 2014 at 23:48
  • 3
    @rmaddy FWIW: at the WWDC, in the Swift presentation it was most clearly stated that Swift and Objective-C have the same runtime.
    – 11684
    Commented Jun 5, 2014 at 21:45
  • 1
    It is public knowledge and was even mentioned in the keynote that it runs on those operating systems. Commented Jun 9, 2014 at 9:06
  • 5
    This question is the one that's used as an example on the tour page. Commented Apr 23, 2017 at 15:06

19 Answers 19

522

I tested it for you. Swift applications compile into standard binaries and can be run on OS X 10.9 and iOS 7.


Simple Swift application used for testing:

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
}
9
  • 13
    See stackoverflow.com/questions/24007050/… - it conflicts with this answer (at least the "or even lower" part).
    – rmaddy
    Commented Jun 3, 2014 at 4:52
  • 14
    I've only tested iOS 7.0 and OS X 10.9. As said in the answer.
    – Leandros
    Commented Jun 3, 2014 at 7:59
  • @Leandros By using var keyword, why do we need to type UIViewController two times in this line "var controller: UIViewController = UIViewController()"? Is var not same as JavaScript/C# (if no, then so sad)? Is this casting, but object types are same on both sides of equal sign?
    – Tien Do
    Commented Jun 6, 2014 at 4:29
  • 3
    @TienDo I don't have any Swift experience, but I suppose the first UIViewController after the colon represents the type of the variable and the second occurrence after the = sign calls the constructor (initializes the variable).
    – ComFreek
    Commented Jun 6, 2014 at 8:42
  • 2
    For iOS : in Xcode 6 beta, there are deployment targets up to iOS 6. I tested them all out, worked find. There are some answers stuating the same.
    – ySiggen
    Commented Jun 27, 2014 at 7:23
199

Swift code can be deployed to OS X 10.9 and iOS 7.0. It will usually crash at launch on older OS versions.

5
  • 4
    Greg, thanks for coming here to answer questions. Can you say a bit about what changed 10.8->10.9 and 6.x->7.0 that allows code generated from Swift to run? Commented Jun 7, 2014 at 9:53
  • 22
    Swift sets some bits in the Objective-C metadata to mark Swift classes. libobjc in OS X 10.9 and iOS 7.0 was changed to ignore these bits in preparation for Swift's arrival. Older OS versions will be confused by these bits. Commented Jun 21, 2014 at 1:05
  • 9
    I'd MUCH appreciate if Apple would consider making Swift apps work on older platforms too (at least from OSX 10.7 onwards). Reason is that we still have many customers with this OS, so we cannot start developing with Swift for years if 10.9 is the minimum supported OS! Commented Jun 21, 2014 at 16:40
  • 2
    @GregParker Any chance you can update this answer for Swift 2, whether the runtime requirements have changed or not? Commented Jun 18, 2015 at 14:00
  • 1
    The minimum supported deployment targets for Swift-built executables remain iOS 7.0 and OSX 10.9. APIs deprecated in iOS 7/OSX 10.9 or earlier will be unavailable. When building, Swift only supports the SDK it ships with in Xcode. Commented Jul 8, 2015 at 16:41
104

Apple has announced that Swift apps will be backward compatible with iOS 7 and OS X Mavericks. The WWDC app is written in Swift.

8
  • 11
    Really WWDC is written in Swift??
    – Satheesh
    Commented Jun 3, 2014 at 15:24
  • 7
    Yes, WWDCC app is written in Swift. As they said yesterday.
    – Shial
    Commented Jun 3, 2014 at 15:38
  • 22
    Jay Freeman claims otherwise: twitter.com/saurik/status/473785847926374400 Commented Jun 3, 2014 at 18:05
  • 2
    Apple's marketing tactic is a common one used by businesses though. Windows was written in Assembly! Well, only the bootloader and some other things, but it was written in assembly.
    – Cole Tobin
    Commented Jun 3, 2014 at 23:23
  • 4
    @IvanVučica but 4 classes are enough to answer the compatibility question.
    – ilya n.
    Commented Jun 4, 2014 at 23:14
101

Update - As per Xcode 6 Beta 4

iOS 7 and OS X 10.9 minimum deployment target

The Swift compiler and Xcode now enforce a minimum deployment target of iOS 7 or OS X Mavericks. Setting an earlier deployment target results in a build failure.

From Xcode 6 release note

So my previous answer(Shown below) will not be applicable to any further development. Swift will no longer available for iOS6 and below


A Swift application can be run on iOS 6. Even though many people are saying that Swift will support only iOS 7+ and OS X 10.9+, from my experience it's not.

I have tested a simple application written completely in Swift in an iOS 6 device. It works perfectly fine. As Apple says, Swift code is binary compatible with Objective-C code. It uses the same compiler and runtime to create the binary.

Here is the code I have tested:

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

It is a simple application, just adding a button programmatically. My application contains only two files, AppDelegate.swift and ViewController.swift.

So if you are not using any new APIs added as part of the iOS 8 SDK or some Swift specific APIs (corresponding API is not available for Objective-C) your application will seamlessly work on iOS 6 or later (tested and working), even on iOS 5 (not tested). Most of the APIs in Swift are just the replacement of the existing Objective-C APIs. In fact they are the same in binary.

Note: As per Xcode 6 beta 4 for swift apps deployment target should be iOS 7 or OS X 10.9(see the above update). So swift will no longer available for iOS6 and below


3
  • The same as previous system updates, some frameworks/classes are discontinued and have to be conditionally supported.
    – Miriam H.
    Commented Jun 5, 2014 at 14:00
  • @TienDo No need of semicolons:) Even if you put by mistake(its a tradition) that wont be a problem Commented Jun 6, 2014 at 4:42
  • 3
    But you can still use semicolons if you really want. two statements in one line are separated by a semicolon Commented Jun 8, 2014 at 3:18
34

In brief:

Swift based applications can target back to OS X Mavericks or iOS 7 with that same app.

How is it possible ?

Xcode embeds a small Swift runtime library within your app’s bundle. Because the library is embedded, your app uses a consistent version of Swift that runs on past, present, and future OS releases.

Why should I trust this answer ?

Because I am not saying this answer as one apple guy told me in twitter or I wrote hello world and tested it.

I took it from apple developer blog.

so you can trust this.

3
  • 2
    "small" takes ~20 mb or something. :) Commented Jan 11, 2017 at 4:59
  • 1
    Including the entire runtime in the binary might seem a little bloated, but because Swift is still not completely stable, it makes sense for them to allow developers to recompile with the new version of Swift in their own time, rather than updating some shared library and breaking everyone's apps. Once Swift stabilizes, I assume the runtime will be stored alongside everything else, in a dylib somewhere. Commented May 28, 2017 at 23:50
  • @WilliamTFroggard - Yeah hope so Commented May 30, 2017 at 11:53
31

Swift uses the same runtime as Objective-C and can even live side-by-side Objective-C in the same application (as per the WWDC 2014 keynote).

This will need to be checked/verified using Xcode 6 and the new SDK to find a final answer.

1
  • 1
    It looks like that using Xcode Beta 6 will allow you to run swift apps on 10.9.3, but I am not sure how far back a swift app will be able to run, ex 10.7 or 10.8?
    – John
    Commented Jun 2, 2014 at 20:07
22

I read all answers that said: No, Swift does not work with less than iOS 7. But I said YES, I just created a Swift project that does run in Xcode 5 with 6.0 deployment target.

  • I just create a demo project in Xcode 6 BETA with the Swift programming language selected.
  • Close Xcode 6 beta, and I open this demo project in Xcode 5 with deployment target 6.0
  • And also select simulator 6.1.

Then that project runs well in simulator 6.1. My MacOS X is 10.9.3, so I said yes, that runs in lower than iOS 7. with 10.9.3 Mac OS X.

Here it is a screenshot of the simulator:

Enter image description here

Here is a demo as well

4
  • 3
    Question: Without swift support how XCode-5 builds the swift source?
    – C--
    Commented Sep 26, 2014 at 4:34
  • you can see the simulatore screenshot :) i did not create above attached screenshot in photoshop Commented May 25, 2016 at 5:34
  • i mean i have converted an objective c app to swift and have customers who are there on ios 6 . So will the swift app work ?
    – AnxiousMan
    Commented May 25, 2016 at 5:44
  • first you try with demo code if that works then yes that definaty works Commented May 25, 2016 at 5:45
20

While code confirms it, Apple itself has said that Swift will be compatible on iOS 7 and Mavericks in their technical keynote (State of the platforms, session 102, around the 34 min 00 sec mark) at WWDC 2014.

15

Swift applications are supported on iOS 7 and above as stated in Beta 4 release notes. iOS 6.0, 6.1, 7.0, 7.1, 8.0 in Xcode 6 Beta

Swift applications are supported on platforms OS X 10.9 and above. OS X 10.4 to 10.10 in Deployment Target. I have tested on targeting 10.5 to 10.10, and running on 10.9.3

5
  • 1
    I think the various deployment targets are just not yet correct (XCode 6 is a beta). Just because you can select the value doesn't mean it works. I tried with OSX 10.7 as target and it did not work. Also note that an authorative confirmation about platforms has been given above by Greg Parker. Commented Jun 21, 2014 at 16:38
  • @Mike Lischke, again, I had several tests to back up my arguments. And I can run OS X app when I select Deployment Target 10.7. But I do appreciate that you brought up the thread of OS X app supports.
    – vladof81
    Commented Jun 21, 2014 at 19:29
  • How do you explain my results then? And what about what Greg Parker wrote? I'd be very happy if Swift Apps would work on 10.7 but so far I haven's seen a working example. Of course I can set 10.7 as deployment target too, but it doesn't make a difference. The app crahs. Commented Jun 22, 2014 at 8:32
  • @Mike Lischke, did you test iOS apps on devices?
    – vladof81
    Commented Jun 25, 2014 at 13:56
  • 1
    I also saw it and tested all the deployment target in Xcode 6 beta (same as the answer). Worked fine using 2 different test apps.
    – ySiggen
    Commented Jun 27, 2014 at 7:22
14

It appears Swift applications don't run on OS X 10.7. I just created a simple GUI application (a view, a lable, a button) which runs fine on Mavericks. The base SDK is set to 10.9 and the deployment target to 10.7. I copied that application from the DerivedData folder over to my 10.7 virtual machine, and it crashs when starting, show this 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
...

However this message is irritating, since there's certainly a CoreGraphics library in this VM. Other applications that make heavy use of CoreGraphics work just fine.

14

This is the post I read from apple Swift blog, might be helpful:

App Compatibility:

If you write a Swift app you can trust that your app will work well into the future. In fact, you can target back to OS X Mavericks or iOS 7 with that same app. This is possible because Xcode embeds a small Swift runtime library within your app's bundle. Because the library is embedded, your app uses a consistent version of Swift that runs on past, present, and future OS releases.

Binary Compatibility and Frameworks:

While your app's runtime compatibility is ensured, the Swift language itself will continue to evolve, and the binary interface will also change. To be safe, all components of your app should be built with the same version of Xcode and the Swift compiler to ensure that they work together.

This means that frameworks need to be managed carefully. For instance, if your project uses frameworks to share code with an embedded extension, you will want to build the frameworks, app, and extensions together. It would be dangerous to rely upon binary frameworks that use Swift — especially from third parties. As Swift changes, those frameworks will be incompatible with the rest of your app. When the binary interface stabilizes in a year or two, the Swift runtime will become part of the host OS and this limitation will no longer exist.

12

I tested running a bare-bone, Swift-based app on an iPod Touch (3rd gen) device. It appears Swift-based apps don't work with iOS 5.x but do work with iOS 6.x.

Here's what shows up in the debug log when I tried to launch the test app with 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

For iOS 6.1.6, the app runs fine without displaying those error messages.

12

There seems to be a lot of old answers here so I just wanted to post the official response from the Swift team. Swift is backwards compatible with OS X Mavericks and iOS 7

Apple developer swift blog : Objective-C id as Swift Any

Jul 11, 2014

Compatibility

One of the most common questions we heard at WWDC was, “What is the compatibility story for Swift?”. This seems like a great first topic.

App Compatibility Simply put, if you write a Swift app today and submit it to the App Store this Fall when iOS 8 and OS X Yosemite are released, you can trust that your app will work well into the future. In fact, you can target back to OS X Mavericks or iOS 7 with that same app. This is possible because Xcode embeds a small Swift runtime library within your app’s bundle. Because the library is embedded, your app uses a consistent version of Swift that runs on past, present, and future OS releases.

11

I also tried a very simple app on 10.8 (one button, sets text on a label). It crashed at startup, as Greg Parker stated:

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

(This was using a deployment target of 10.7)

10

Try the following code:

It's working without 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
}
1
  • And how to use nav.rootviewcontroller ??
    – Allan
    Commented Jun 5, 2014 at 2:28
8

Yes, in fact Apple has announced that Swift apps will be backward compatible with iOS 7 and OS X Mavericks. Furthermore the WWDC app is written in the Swift programming language.

8

When it comes to Swift Frameworks. As for today, with Xcode version 6.1.1 (6A2008a), if the Swift framework is targeted to iOS 7.1, linker report warning

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

and application can't be submitted to AppStore. Check this issue : Lint to prevent dynamic libraries and frameworks from passing with iOS 7

1
  • Swift Framework's Mach-O Type must be Dynamic Library, however, iOS 7 accepts Static Library Only.
    – DawnSong
    Commented Feb 24, 2016 at 14:10
7

Quick Update, effective from February 15th, 2015, we cannot submit apps to the store that were developed using an SDK prior to iOS 8. So, keeping that in mind , its better to not to worry about this issue as many people have suggested that apps made in Swift can be deployed to OS X 10.9 and iOS 7.0 as well.

3
  • Would you provide us a source ?
    – Binus
    Commented Mar 15, 2016 at 15:05
  • 1
    There is a difference between Base SDK and Deployment Target. You can have a Base SDK of iOS 9 and a Deployment Target of iOS 7 and submit to iTunes Connect. Downvoting because you did not provide a source.
    – Cœur
    Commented May 27, 2017 at 1:59
  • 1
    Current Apple documentation still mentions support for iOS 4.3: developer.apple.com/library/content/documentation/IDEs/…
    – Cœur
    Commented May 27, 2017 at 2:11
1

Answered code-snippet posted by Leandros seems bit old. I have fixed and made it compilable 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
}

Not the answer you're looking for? Browse other questions tagged or ask your own question.