Swift 5.0 开始,实现了 ABI 稳定性,意味着同样的源码,即使是使用不同版本的 Swift 编译, 编译后的程序都可以在 Swift 5 Runime 下运行,而不需要要求目标环境的 Runtime 和开发环境一致。
ABI 稳定性的好处就是目标环境所带的 Swift 5 runtime 可以不升级,也不需要在 App 里内置一份独立的 runtime 库。
Swift 5.1 开始,支持了 Module 稳定性。就是说使用 Swift 5.1 编译的二进制库,是具有模块稳定性的,在链接性上可以与其他版本的 Swift 兼容。
默认情况下模块稳定性是关闭的,不同版本的 Swift 编译的库是不能导入项目中直接使用,会报错:
Module compiled with Swift 5.1 cannot be imported by the Swift 5.2 compiler
在 framework 项目中打开模块稳定性的方法:
在 Xcode 的 Build Settings 设置中,把 Build Libraries for Distribution
设置为 Yes
。
如果是使用 Carthage 编译 framework 的,使用 xcconfig 来设置全局配置:
xcconfig=$(mktemp /tmp/zsxq.xcconfig.XXXXXX)
trap 'rm -f "${xcconfig}"' INT TERM HUP EXIT
echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES' >> ${xcconfig}
export XCODE_XCCONFIG_FILE="$xcconfig"
carthage build --use-xcframeworks --no-use-binaries
如果在使用 Swift 命令行编译的,编译参数是:-enable-library-evolution
另外,如果在 Swift 的 framework 源码中,使用了桥接头文件混编译 Objective-C 的话,是不能开启模块稳定性的。