哪些版本的 Xcode 支持哪些版本的 Swift?

Posted

技术标签:

【中文标题】哪些版本的 Xcode 支持哪些版本的 Swift?【英文标题】:What versions of Swift are supported by what versions of Xcode? 【发布时间】:2018-12-25 11:20:23 【问题描述】:

我以 Swift 开发应用程序为生。我喜欢这种语言,并尽可能地遵循它。然而,某些事实仍然漏掉了,无论是我瞎了眼,还是 Apple 对此保持沉默。

今天,我发现存在 Swift 3.3 和 3.4。我假设 3.2 是 3 的最后一个版本,用于迁移到 4、4.2 和 5。这种误解主要是由于 Swift.org、the official Git repo 和 Xcode Release Notes 没有完全提及

所以,我认为这些也是过渡性的,但我不知道它们出现在什么 IDE 或编译器中,或者它们带有什么警告。下表总结了我的知识:

下表已过时,仅供参考,因此问题是有道理的。 I've posted an updated version of this table in an answer below.

紫色空间中的内容是什么?专门针对 3.3 和 3.4 行,但如果您知道其他行,那也会有所帮助!

权威来源也很棒。


主要问题的可能答案如下:

    Swift 3.3 仅在 Xcode 9.3 测试版中,从未公开; Swift 3.4 仅在 Xcode 9.3 - 9.4 中 Swift 3.3 仅在 Xcode 9.3 中受支持; Xcode 9.3.1 和 9.4 支持 Swift 3.4 Xcode 9.3 和 9.3.1 支持 Swift 3.3; Swift 3.4 仅在 Xcode 9.4 中受支持 Xcode 版本 9.3 到 9.4 支持 Swift 3.3; Swift 3.4 仅在 Xcode 10 测试版中受支持。

我不认为还有另一种可能性。不过,如果我不在基地,请告诉我。

【问题讨论】:

您的图表令人愉快,但我不明白您为什么需要询问这个问题。确定某个版本的 Xcode 中包含哪个版本的 Swift 的方法当然是下载该版本的 Xcode 并查看。 值得注意的是,Swift 3.2、3.3 和 3.4 是伪版本——它们的存在仅代表分别在 Swift 3 兼容模式下运行的 Swift 4.0、4.1 和 4.2 编译器。 github.com/apple/swift-evolution/blob/master/proposals/… 中有一个方便的表格,将编译器映射到每种兼容模式的语言版本(请注意,5.0 和 5.1 的行不再准确,因为随着提案的实施而版本冲突停止了)。 “你有可以提取它的方法吗?”是的,我愿意。你也是。例如:hackingwithswift.com/example-code/language/… 编写一个小代码 sn-p 使用它来告诉你我们是在哪个 Swift 版本下编译的并不难。 编译器版本可以通过运行xcrun swift --version获得(你可以使用xcode-select来选择命令行工具的版本,或者在Xcode的“位置”选项卡下的首选项中更改它)。 值得注意的是,***有一个 Xcode 版本的 Swift 编译器版本表,这可能很有用:en.wikipedia.org/wiki/Xcode#Toolchain_versions 【参考方案1】:

由于我一直在收集数据并进行测试,因此我将在此答案中以更新图表的形式发布我的结果:

不久前,我发现新版本的 Xcode 实际上并不支持从所有旧版本的 Swift 迁移。我确实明确测试过 Xcodes 10.2 到 11 不支持 Swift 3.x 及更早版本,所以我将它们涂成白色。我还没有时间测试 Xcode 8.3 到 10.1,但我怀疑他们会迁移 3.x,但不会迁移 2.x 或更早版本; 这就是为什么顶部有一个很大的“未知”块


来源

使用此测试代码进行手动测试:https://github.com/BenLeggiero/Swift-Version-Checker Xcode Release Notes Swift Release Notes

【讨论】:

@ravemir 就像我在之前的评论中提到的那样,它们与以前版本的 Xcode 中编号相似(或相同)的 Swift 不同。它们实际上是该版本 Xcode 支持的最新 Swift 版本的后端,但使用较旧的 Swift 语法(例如 Xcode 10.2 支持 Swift 4.1.50,即 Swift 5.0.1 和 Swift 4.1.x 语法)。由于这种奇怪,我建议您只使用该版本的 Xcode 支持的最新 Swift 版本;没什么不同。 请在任何不赞成票的同时附上评论,解释我如何从现在开始提供更好的答案? 很遗憾,我不能两次投票,但感谢您保持这一点。 @Kymer 除了测试自己,我也经常看the Xcode release notes 和Swift release notes 这将是 SO.com 的问题,对我的工作影响最小,但我最喜欢。【参考方案2】:

这不是填充图表中所有未知空间的完整答案,但也许我可以填写一些有用的东西......

斯威夫特 3.x?

当 Swift 4 开发开始时(并在 WWDC17 上首次正式宣布),编译器的版本号与该语言的版本号分叉。 (这很像 ANSI C 标准与 clang 和 GCC 编译器的版本控制不同。)

语言版本号跟踪源代码兼容性——语言定义本身、标准库以及 Apple 平台 SDK 在 Swift 中出现的方式。如果您有“Swift 3”代码,您应该能够使用 Swift 编译器的版本 3 或任何更高版本的编译器(使用 -swift-version 3 选项时)对其进行编译。

但“Swift 3”——语言版本——也没有保持不变。随着 Swift 的不断发展,纯附加的语言、标准库和 SDK 的更改可用于 Swift 3。因此,如果您拥有 Swift 3 代码库并开始使用更新的编译器,您可以选择是否转换所有内容到 Swift 4,开始使用新的编译器功能,或者保持与旧的 Swift 3 编译器的兼容性。

这意味着编译器版本与可能的语言兼容版本有一个映射:

Swift 语言 3.2 是 Swift 编译器 4.0 的“Swift 3 模式” Swift 语言 3.3 是 Swift 编译器 4.1 的“Swift 3 模式” Swift 语言 3.4 是 Swift 编译器 4.2 的“Swift 3 模式”

目前还没有 Swift 5(语言或编译器)版本,但是当这种情况发生时,它可能会允许在 -swift-version 4 模式下构建,创建一个“Swift 4.3”语言版本。 (假设未来的 Swift 4.x 版本不会优先考虑这些数字。)

我不知道这个答案的单一来源,但你可以把它放在一起:

Version Compatibility 在Swift 编程语言一书中 SE-212 Compiler Version Directive WWDC17 和 WWDC18 Swift 新特性讲座 下载各种测试版、当前和过去的 Xcode 版本

版本历史

对图表中较早的部分进行了一些小的更正:

Xcode 8 包含两个独立版本的编译器,而不是一个带有-swift-version 开关的编译器。 Xcode 8.3 stopped including the Swift 2.3 compiler,让 Swift 3.1 成为该版本中唯一支持的 Swift 语言。

Xcode 7 / Swift 2 从不支持编译 Swift 1.x 代码,只支持迁移它。 Xcode 7.2 及更高版本,直到当前的 Xcode 10 测试版,仍然包括“转换为当前 Swift 语法”迁移器,理论上它支持从任何旧版本的 Swift 迁移。

Xcode 6.0 到 6.2.x 支持在 OS X Mavericks (10.9) 上运行 Xcode。 Xcode 6.3 是第一个需要 OS X Yosemite (10.10) 的版本。

其他来源:old Xcode downloads。

气馁?

我不确定这个标签的适用程度...

在 Xcode 8.x 包含 Swift 2.3 编译器期间,它完全支持构建应用程序并提交到 App Store。不过,你可以说它在当时仍然“不受欢迎”,因为 Apple 表示它不会继续存在,而且 Swift 3.0 将是后来的编译器向后兼容的第一个语言版本。

Xcode 9 完全支持/完全支持 Swift 3.2 — 与 Swift 2.3 -> 3.0 不同,没有来自 Apple 或 Swift 开源项目的“在我们将其取消之前先退出此版本”的消息。 Swift 语言版本 3.2、3.3 和 3.4 明确存在的原因是允许开发人员维护“Swift 3”代码库,同时获得更新的编译器和 IDE 版本的好处。

【讨论】:

这太棒了,感谢您非常彻底的回答!我一定能让我的图表更准确。只是几个问题:主要是......我在 Swifts 3.3-3.4 / Xcodes 9.3-9.4 的紫色区域做什么?另外,Xcode 7.x 是否可以将 Swift 1.0 迁移到 2.x,或者只是 1.2 到 2.x? AFAIK 迁移器不确定您的项目当前使用的语言版本——它只知道哪些语法模式不再是最新的以及如何修复它们。 (至少,在 Xcode 7 中肯定是这种情况。由于 Swift 3 / Xcode 8,您的项目至少包含一些“预期的 Swift 版本”信息,但尚不清楚是否有足够的信息来帮助迁移者完成所需的一切。) 我已将您的所有建议铭记于心,并制作了an updated chart in my answer。非常感谢! 由于我发布的图表似乎对人们有很好的帮助,我将其标记为已接受的答案(主要针对 Google 员工)。因为你的回答让我走上了解决问题的道路,所以我会给它一个赏金?

以上是关于哪些版本的 Xcode 支持哪些版本的 Swift?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 6 beta 4中的Swift有哪些改变?

Xcode 11.3.1 兼容性

无效的 Swift 支持 xcode 版本 11.6 (11E708)

我应该将 Xcode 项目的哪些文件存储在版本控制中?

Swift 项目中的版本控制

我如何通过 swift 2.3 项目支持 iOS 版本 10.3