在 Swift 4 之前,编译器的版本和语言是一模一样的。但是从 Swift 4 开始,编译器可以在与以前的 Swift 版本兼容的模式下运行。在 Swift 4.0 发行说明中查看有关compatibility modes 的更多信息
Xcode 构建设置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 语言版本为 4.2 时,这并不意味着使用 Swift 4.2 编译器。编译器版本仍为 5.1.3,Swift 语言版本设置指示编译器以 Swift 4.2 兼容模式运行。兼容模式意味着你可能不需要修改你的 swift 4.2 代码来使用新版本的编译器。因为在兼容模式下运行的编译器允许 Swift 4.2 版代码与 5 版及更高版本的代码一起编译和运行。
具有兼容模式的 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 5 之前使用 swift 4 编译器编写的
如下所示,此代码将无错误地编译。
在 swift 5 发布后,如果您尝试使用 Swift 5 编译器编译此代码,如下所示。
您将收到上面显示的警告,因为 encodedOffset 在 swift 5 中已被弃用。
您可以降级并使用 swift 4 编译器,也可以在兼容模式下使用 Swift 5 编译器,并带有编译器标志 -swift-version,如下所示。
需要注意的是,Swift 4 编译器和Swift-4 兼容模式下的Swift 5 编译器不是一回事。运行兼容模式的 swift 5 编译器通常可以使用新的 swift 5 语言功能。这使得开发人员即使无法升级到 Swift 5 也可以使用新功能。Swift 4 编译器将无法使用新的 Swift 5 功能。