基于swift的应用程序能在OS X 10.9 (Mavericks)/iOS 7及更低版本上运行吗?

例如,我有一台运行OS X 10.8 (Mountain Lion)的机器,我想知道我用Swift写的应用程序是否能在它上面运行。

或者我应该有什么创建一个Swift应用程序使用Mac OS?


当前回答

更新-根据Xcode 6 Beta 4

iOS 7和OS X 10.9的最低部署目标 Swift编译器和Xcode现在强制ios7或OS X的最低部署目标 小牛。设置较早的部署目标会导致构建失败。

来自Xcode 6发布说明

所以我之前的答案(如下所示)将不适用于任何进一步的开发。Swift将不再适用于iOS6及以下系统


Swift应用可以在iOS 6上运行。尽管很多人说Swift只支持iOS 7+和OS X 10.9+,但从我的经验来看,事实并非如此。

我在iOS 6设备上测试了一个完全用Swift编写的简单应用程序。它工作得非常好。正如苹果所说,Swift代码与Objective-C代码是二进制兼容的。它使用相同的编译器和运行时来创建二进制文件。

下面是我测试过的代码:

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

这是一个简单的应用程序,只是通过编程方式添加一个按钮。我的应用程序只包含两个文件,AppDelegate.swift和ViewController.swift。

因此,如果你没有使用任何作为iOS 8 SDK的一部分添加的新API或一些Swift特定的API(对应的API不适用于Objective-C),你的应用程序将无缝地运行在iOS 6或更高版本(测试并工作),甚至在iOS 5(未测试)上。Swift中的大多数api只是对现有Objective-C api的替换。事实上,它们在二进制中是一样的。

注意:根据Xcode 6 beta 4的swift应用程序部署目标应该是iOS 7或OS X 10.9(见上面的更新)。所以swift将不再适用于iOS6及以下系统


其他回答

更新-根据Xcode 6 Beta 4

iOS 7和OS X 10.9的最低部署目标 Swift编译器和Xcode现在强制ios7或OS X的最低部署目标 小牛。设置较早的部署目标会导致构建失败。

来自Xcode 6发布说明

所以我之前的答案(如下所示)将不适用于任何进一步的开发。Swift将不再适用于iOS6及以下系统


Swift应用可以在iOS 6上运行。尽管很多人说Swift只支持iOS 7+和OS X 10.9+,但从我的经验来看,事实并非如此。

我在iOS 6设备上测试了一个完全用Swift编写的简单应用程序。它工作得非常好。正如苹果所说,Swift代码与Objective-C代码是二进制兼容的。它使用相同的编译器和运行时来创建二进制文件。

下面是我测试过的代码:

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

这是一个简单的应用程序,只是通过编程方式添加一个按钮。我的应用程序只包含两个文件,AppDelegate.swift和ViewController.swift。

因此,如果你没有使用任何作为iOS 8 SDK的一部分添加的新API或一些Swift特定的API(对应的API不适用于Objective-C),你的应用程序将无缝地运行在iOS 6或更高版本(测试并工作),甚至在iOS 5(未测试)上。Swift中的大多数api只是对现有Objective-C api的替换。事实上,它们在二进制中是一样的。

注意:根据Xcode 6 beta 4的swift应用程序部署目标应该是iOS 7或OS X 10.9(见上面的更新)。所以swift将不再适用于iOS6及以下系统


我刚刚为你测试了一下,Swift应用程序编译成标准二进制文件,可以在OS X 10.9和iOS 7上运行。


简单的Swift应用程序用于测试:

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
}

我在iPod Touch(第三代)设备上测试了一个基于swift的基本应用程序。基于swift的应用程序似乎无法在iOS 5上运行。但是在iOS 6.x上运行。

下面是我试图在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

对于iOS 6.1.6,应用程序运行良好,没有显示这些错误消息。

Swift应用程序似乎不能在OS X 10.7上运行。我刚刚创建了一个简单的GUI应用程序(一个视图、一个标签、一个按钮),它在Mavericks上运行良好。基本SDK设置为10.9,部署目标设置为10.7。我把这个应用程序从DerivedData文件夹复制到我的10.7虚拟机,它在启动时崩溃了,显示这个错误:

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

然而,这个消息是令人恼火的,因为在这个VM中肯定有一个CoreGraphics库。其他大量使用CoreGraphics的应用程序也可以正常工作。

苹果公司宣布Swift应用程序将向后兼容iOS 7和OS X Mavericks。WWDC应用程序是用Swift编写的。