基于Swift的应用程序是否适用于OS X 10.9/iOS 7及更低版本?

MeI*_*eIr 612 macos ios swift

基于Swift的应用程序是否适用于OS X 10.9(Mavericks)/ iOS 7及更低版本?

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

Lea*_*ros 519

我刚刚为您测试过,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
}
Run Code Online (Sandbox Code Playgroud)

  • 我只测试了iOS 7.0和OS X 10.9.如答案所述. (14认同)
  • 请参阅http://stackoverflow.com/questions/24007050/swift-with-ios-5-deployment-target - 它与此答案冲突(至少是"甚至更低"的部分). (13认同)
  • @TienDo我没有任何Swift经验,但我想冒号之后的第一个`UIViewController`表示变量的类型,第二个出现在`=`符号后调用构造函数(初始化变量). (3认同)
  • 对于iOS:在Xcode 6 beta中,有部署目标直到iOS 6.我测试了它们全部,找到了.有一些答案是相同的. (2认同)

Gre*_*ker 198

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

  • Swift在Objective-C元数据中设置一些位来标记Swift类.OS X 10.9和iOS 7.0中的libobjc被更改为忽略这些位以准备Swift的到来.较旧的OS版本将被这些位混淆. (20认同)
  • 如果Apple考虑让Swift应用程序在旧版平台上运行(至少从OSX 10.7开始),我还是很感激.原因是我们仍有许多客户使用此操作系统,因此如果10.9是最低支持的操作系统,我们无法开始使用Swift多年! (9认同)
  • 格雷格,谢谢你来这里回答问题.你能否说一下改变10.8-> 10.9和6.x-> 7.0的内容,它允许Swift生成的代码运行? (4认同)
  • @GregParker你是否有机会更新Swift 2的答案,运行时要求是否已经改变? (2认同)

Ben*_*ieb 104

Apple宣布Swift应用程序将向后兼容iOS 7和OS X Mavericks.WWDC应用程序是用Swift编写的.

  • Jay Freeman另有说法:https://twitter.com/saurik/status/473785847926374400 (22认同)
  • 真的WWDC是用Swift写的吗? (11认同)
  • 是的,WWDCC应用程序是用Swift编写的.正如他们昨天所说. (7认同)
  • @IvanVučica但是4个类足以回答兼容性问题. (4认同)
  • Apple的营销策略是企业常用的营销策略.Windows是用Assembly编写的!好吧,只有bootloader和其他一些东西,但它_was_写在汇编. (2认同)

Ani*_*ese 100

更新 - 根据Xcode 6 Beta 4

iOS 7和OS X 10.9最低部署目标

Swift编译器和Xcode现在强制实施iOS 7或OS X Mavericks的最低部署目标.设置较早的部署目标会导致构建失败.

来自Xcode 6发行说明

所以我之前的回答(如下所示)将不适用于任何进一步的开发.iOS版及更低版本将不再提供Swift


Swift应用程序可以在iOS 6上运行.虽然很多人都说Swift只支持iOS 7+和OS X 10.9+,但从我的经验来看并非如此.

我已经在iOS 6设备中测试了一个完全用Swift编写的简单应用程序.它工作得很好.正如Apple所说,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")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的应用程序,只需以编程方式添加按钮即可.我的应用程序只包含两个文件,AppDelegate.swiftViewController.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(参见上面的更新).iOS6及以下版本将不再适用swift


  • 但如果你真的想要,你仍然可以使用分号.一行中的两个语句用分号分隔 (3认同)

Dur*_*n.H 33

简单来说:

基于Swift的应用程序可以使用相同的应用程序回溯到OS X MavericksiOS 7.

这怎么可能 ?

Xcode 在您的应用程序包中嵌入了一个小的Swift运行时库.由于库是嵌入式的,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本.

我为什么要相信这个答案?

因为我不是说这个答案是因为一个苹果人在推特上告诉我,或者我写了你好世界并测试了它.

我是从苹果开发者博客那里拿来的.

所以你可以相信这一点.

  • "小"需要大约20 MB或者其他东西.:) (2认同)

Chr*_*ann 30

Swift使用与Objective-C相同的运行时,甚至可以在同一个应用程序中使用并行的Objective-C(根据WWDC 2014主题演讲).

这需要使用Xcode 6和新SDK 进行检查/验证,以找到最终答案.


Nit*_*hel 22

我读了所有的答案:不,Swift不能用于iOS 7.但是我说YES,我刚刚创建了一个Swift项目,该项目在Xcode 5中以6.0部署目标运行.

  • 我只是选择了Swift编程语言,在Xcode 6 BETA中创建了一个演示项目.
  • 关闭Xcode 6 beta,我在部署目标6.0的Xcode 5中打开这个演示项目
  • 并选择模拟器6.1.

然后该项目在模拟器6.1中运行良好.我的MacOS X 10.9.3是,所以我说是的,在低于上运行的iOS 7. 10.9.3的Mac OS X.

这是模拟器的屏幕截图:

在此输入图像描述

这是一个演示

  • 问题:没有快速支持XCode-5如何构建swift源代码? (3认同)

vir*_*ndh 20

虽然代码证实了这一点,但苹果公司本身已经表示,Swift将在iOS 7和Mavericks上的技术主题演讲(平台状态,会议102,大约34分00秒标记)在WWDC 2014上兼容.


vla*_*f81 15

如Beta 4发行说明中所述,iOS 7及更高版本支持Swift应用程序.Xcode 6 Beta中的iOS 6.0,6.1,7.0,7.1,8.0

OS X 10.9及更高版本的平台支持Swift应用程序.部署目标中的OS X 10.4到10.10.我已经测试了目标10.5到10.10,并在10.9.3上运行


Mik*_*hke 14

看起来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
...
Run Code Online (Sandbox Code Playgroud)

然而,这条消息令人恼火,因为这个VM中肯定有一个CoreGraphics库.其他大量使用CoreGraphics的应用程序运行得很好.


Yat*_*B L 14

这是我从苹果Swift博客上读到的帖子,可能会有所帮助:

应用兼容性:

如果你编写一个Swift应用程序,你可以相信你的应用程序将来会很好用.事实上,您可以使用相同的应用程序回溯到OS X Mavericks或iOS 7.这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库.由于库是嵌入式的,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本.

二进制兼容性和框架:

虽然确保了应用程序的运行时兼容性,但Swift语言本身将继续发展,二进制接口也将发生变化.为了安全起见,应用程序的所有组件都应使用相同版本的Xcode和Swift编译器构建,以确保它们协同工作.

这意味着需要仔细管理框架.例如,如果您的项目使用框架与嵌入式扩展共享代码,您将需要一起构建框架,应用程序和扩展.依赖使用Swift的二进制框架是危险的 - 尤其是来自第三方的框架.随着Swift的变化,这些框架将与您的应用程序的其余部分不兼容.当二进制接口在一两年内稳定,雨燕运行时将成为主机操作系统的一部分,这个限制将不复存在.


Dav*_*d H 12

我测试了在iPod Touch(第三代)设备上运行基于Swift的裸机应用程序.看起来基于Swift的应用程序无法与iOS 5.x一起使用,但可以与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
Run Code Online (Sandbox Code Playgroud)

对于iOS 6.1.6,应用程序运行正常,但不显示这些错误消息.


Ore*_*ren 12

这里似乎有很多旧的答案,所以我只想发布Swift团队的官方回复.Swift向后兼容OS X Mavericks和iOS 7

Apple开发者swift博客:Objective-C id as Swift Any

2014年7月11日

兼容性

我们在WWDC上听到的最常见问题之一是"Swift的兼容性故事是什么?".这似乎是一个很好的第一个话题.

应用程序兼容性简单地说,如果您今天编写Swift应用程序并在今年秋季iOS 8和OS X Yosemite发布时将其提交到App Store,您可以相信您的应用程序将在以后很好地运行.事实上,您可以使用相同的应用程序回溯到OS X Mavericks或iOS 7.这是可能的,因为Xcode在您的应用程序包中嵌入了一个小的Swift运行时库.由于库是嵌入式的,因此您的应用程序使用在过去,现在和将来的OS版本上运行的Swift的一致版本.


小智 11

我还在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
Run Code Online (Sandbox Code Playgroud)

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


PRE*_*MAR 10

请尝试以下代码:

它没有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
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*cin 8

谈到Swift Frameworks.至于今天,使用Xcode版本6.1.1(6A2008a),如果Swift框架针对iOS 7.1,链接器报告警告

ld: warning: embedded dylibs/frameworks only run on iOS 8 or later.
Run Code Online (Sandbox Code Playgroud)

和应用程序无法提交到AppStore.检查此问题:Lint以防止动态库和框架通过iOS 7


小智 8

是的,实际上Apple宣布Swift应用程序将向后兼容iOS 7和OS X Mavericks.此外,WWDC应用程序是用Swift编程语言编写的.


13t*_*ost 7

快速更新,自2015年2月15日起生效,我们无法将应用程序提交到使用iOS 8之前SDK开发的商店.所以,记住这一点,最好不要担心这个问题,因为很多人都建议用Swift制作的应用程序也可以部署到OS X 10.9和iOS 7.0.