ios - 什么是 "Swift Language Version"Xcode 设置?因为它仍然使用旧版本集构建更新的 Swift 代码

标签 ios swift xcode macos

我正在使用“Swift 语言版本”设置为“Swift 4”的 Xcode 项目构建源代码。即使有了这个集合,该项目也会使用新的 isMultiple(of:) 构建 Swift 5.1 源代码,例如隐式返回和 Swift 5 源代码。方法。

即使将“Swift Language Version”设置为“Swift 4”或“Swift 4.2”,Swift 5 和 5.1 代码仍然有效

仅在运行 #elseif swift(>=4.1) 时声明似乎存在差异(来自 https://stackoverflow.com/a/46080904/414415 的代码)。这些结果输出了他们的预期结果。

但是,我想知道,当build设置明确指出 Swift 4 时,我的 Swift 5 源代码如何成功编译?如果设置没有改变我可以使用的 Swift 版本,它实际上是做什么的?

最佳答案

在 Swift 4 之前,编译器的版本和语言是一回事。但是从 Swift 4 开始,编译器可以以兼容模式运行以前的 Swift 版本。查看更多信息 compatibility modes在 Swift 4.0 发行说明中

Xcode build设置 SWIFT_VERSION设置编译器标志 -swift-version这是语言模式。从 swift 编译器打印出来的这个参数只会改变输入的解释方式。

swiftc -h|grep 'Swift language version number'
  -swift-version <vers>   Interpret input according to a specific Swift language version number

因此,当您选择 Swift Language Version 为 4.2 时,并不意味着使用 Swift 4.2 编译器。编译器版本仍然是 5.1.3,Swift Language Version 设置指示编译器在 Swift 4.2 兼容模式下运行。兼容模式意味着您可能不需要修改 swift 4.2 代码来使用新版本的编译器。因为在兼容模式下运行的编译器允许 Swift 4.2 版代码与 5 版及更高版本的代码一起编译和运行。

compiler options

具有兼容模式的 Swift 5 编译器可以编译用 编写的代码。 Swift 4 语法 , Swift 4.2 语法 , 或 Swift 5 语法 .

这是一个代码示例,使用以下代码创建文件 test.swift:
//code written before siwft 5
let firstName = "michael jackson"
let offset = firstName.endIndex.encodedOffset

// Check swift version being used.
#if swift(>=5.2)
print("Hello, Swift 5.2")

#elseif swift(>=5.1)
print("Hello, Swift 5.1")

#elseif swift(>=5.0)
print("Hello, Swift 5.0")

#elseif swift(>=4.2)
print("Hello, Swift 4.2")

#elseif swift(>=4.1)
print("Hello, Swift 4.1")

#elseif swift(>=4.0)
print("Hello, Swift 4.0")

#endif

假设上面的代码是在使用 swift 4 编译器的 swift 5 之前编写的
这段代码将编译没有错误,如下所示。

enter image description here

如果您尝试使用 Swift 5 编译器编译此代码,则在 swift 5 发布后,如下所示。

Swift 5 compiler

您将收到上面显示的警告 encodedOffset在 swift 5 中已弃用。

您可以降级并使用 swift 4 编译器,或者您可以在兼容模式下使用 Swift 5 编译器与编译器标志 -swift-version ,如下所示。

Swift 5 compiler with compatibility mode

需要注意的是 Swift 4 编译器 ,以及 Swift-4 兼容模式下的 Swift 5 编译器 不是一回事。新的 swift 5 语言功能通常可用于运行兼容模式的 swift 5 编译器。这允许开发人员即使在无法升级到 swift 5 的情况下也可以使用新功能。新的 Swift 5 功能将不适用于 Swift 4 编译器 .

关于ios - 什么是 "Swift Language Version"Xcode 设置?因为它仍然使用旧版本集构建更新的 Swift 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60177016/

相关文章:

Xcode 的 "rebase local changes onto upstream changes"?

ios - 获取存储在应用程序文档文件夹中的文件内容

iphone - 在 iOS 上创建用作数据库的简单文件,用于搜索邮政编码

ios - 在 Objective-C 中显示 pdf 的最佳方式是什么?

ios - Unwind segue - 返回多个 View

ios - 如何将 viewWillTransition 保留到一个 View Controller 而不是全部?

ios - 两个具有相似功能的 View Controller VIPER

xcode - 比较SceneKit中不同物体的颜色

ios - 使用 Swift 的 SpriteKit 中 presentScene 上的黑屏

iphone - 我的文本字段不可编辑