Swift Xcode 中使用较低的 4.0.3 版本而不是 5.0.1 的构建设置未强制执行

Swift build settings in Xcode to use lower 4.0.3 version instead of 5.0.1 are not enforced

我正在 Xcode 10.3 中创建一个简单的 Swift 框架,并尝试使用较低的 Swift 4.0.3 版本。我转到 Xcode 构建设置并从 5.0.1 切换到 4.0.3,然后构建项目。

我 运行 otool 针对结果框架以确保它是使用正确的 Swift 版本构建的,但包含的库仍然来自 Swift 5.0.1(对应于1001.0.82 来自下面的输出):

otool -l SwiftyHello.framework/SwiftyHello

cmd LC_LOAD_DYLIB
cmdsize 56
name @rpath/libswiftCore.dylib (offset 24)
time stamp 2 Wed Dec 31 16:00:02 1969
current version **1001.0.82**
compatibility version 1.0.0

我的工具链是 运行 Swift 5.0.1:

swift -version

Apple Swift version 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)
Target: x86_64-apple-darwin18.7.0

如何确保 Swift 框架是使用 Swift 4.0.3 构建的?

SWIFT_VERSION(Swift 语言版本)密钥对生成的二进制文件的实际 Swift 版本没有任何作用。来自 $ swift --help:

-swift-version Interpret input according to a specific Swift language version number

所以,基本上,Xcode 使用 -swift-version 4 参数执行 Swift 编译器。它改变了 Swift 编译器解析源文件的方式,但不会以任何方式影响二进制文件。

要构建实际的 Swift 4 二进制文件,您必须安装 Swift 4 toolchain。然后您就可以从菜单 Xcode -> Toolchains 中选择正确的工具链。但是,老实说,我不建议这样做,因为 Apple 不关心旧版本的工具链,并且 Xcode 通常对它们表现不稳定。

相反,我建议您从 Apple Downloads 网站安装较旧的 Xcode(在您的情况下为 9.3)并从那里构建项目。

或者,您可以在 Github Actions, CircleCI or TravisCI 中设置相对简单的 CI/CD 并在那里同时构建多个 Xcode 版本。并在本地使用最新的Xcode。因为它们这些 CI 为您提供了具有不同 Xcode 和 macOS 版本的多个虚拟环境。