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

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

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


当前回答

Swift代码可以部署在OS X 10.9和iOS 7.0上。在较旧的操作系统版本上,它通常会在启动时崩溃。

其他回答

说到Swift框架。 截至目前,在Xcode 6.1.1 (6A2008a)版本中,如果Swift框架针对iOS 7.1,链接器报告警告

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

并且应用程序无法提交到AppStore。检查这个问题:Lint阻止动态库和框架在iOS 7中传递

试试下面的代码:

它在没有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
}

Swift代码可以部署在OS X 10.9和iOS 7.0上。在较旧的操作系统版本上,它通常会在启动时崩溃。

更新-根据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及以下系统


我还尝试了10.8上一个非常简单的应用程序(一个按钮,设置标签上的文本)。它在启动时崩溃了,正如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

(这是使用10.7的部署目标)