使用 Swift 4.0 编译的模块无法在 Swift 3.1 中导入框架二进制文件

Posted

技术标签:

【中文标题】使用 Swift 4.0 编译的模块无法在 Swift 3.1 中导入框架二进制文件【英文标题】:Module compiled with Swift 4.0 cannot be imported in Swift 3.1 for framework binary 【发布时间】:2017-09-14 10:27:54 【问题描述】:

我使用 xcode 9(swift 版本 3.2)编译了一个框架二进制文件。而且我还想让它与带有 swift 3.2 语​​法的 xcode 8.3.3 一起使用。但是,当我尝试使用使用 xcode 9 编译的框架运行项目时,我不断收到 Module compiled with Swift 4.0 cannot be imported in Swift 3.1 错误消息。我应该添加哪个选项才能使其正常工作?我知道这是可能的,因为pod Intercom 在 xcode 8.3.3 和 9 下都可以使用。我将不胜感激任何建议

【问题讨论】:

我猜不是因为我的框架不支持 3.1、3.2。在 xcode 8.3.3 项目中,我找不到 swift 3.2 的项目选项 【参考方案1】:

由于显而易见的原因,您不能在使用旧版本 Swift 的项目中使用使用新版本 Swift 编译的模块。使用较新的 Swift 版本编译的框架可能使用较新的 Swift 语法和/或仅在较新的 Swift 版本中可用的 API,因此您将无法从使用较新语法或 API 的框架中调用任何函数。这个问题是由于 Swift 还不是 ABI 稳定的事实。有关该主题的更多信息,请参阅ABI Stability Manifesto。

Swift 3.2 仅作为 Xcode9 的一部分引入,以使 Swift3->4 转换更容易。 Xcode8.3.3 只支持 Swift 3.1,而 Xcode9 只支持 Swift 3.2 及以上,所以你不能编译你的框架在两个主要的 Xcode 版本中都可以使用。

如果您想在框架的二进制版本中同时支持 Xcode8 和 Xcode9,则需要提供使用不同 Swift 编译器版本编译的不同版本。至于使用 Cocoapods/Carthage 的动态框架,您可以使用条件编译块,如#if swift(>=3.2) 来编写与多个版本的 Swift 编译器兼容的代码。如需更多信息,请参阅The Swift Programming Language (Swift 4) - Version compatibility。

【讨论】:

好的,我明白了,但github.com/intercom/intercom-ios 对讲机不知何故克服了这个问题。通过cocoapods 在Xcode 8 和9 上安装对讲机都可以,并且它们的框架是二进制形式。

以上是关于使用 Swift 4.0 编译的模块无法在 Swift 3.1 中导入框架二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 中的 AlamofireImage 问题

使用 Swift 4.1 编译的模块无法在 Swift 3.2.3 中导入

使用 Swift 3.0.1 编译的模块无法在 BuddyBuild 上的 Swift 3.0 中导入

使用 Swift 2.3 编译的模块无法在 Swift 3.0 中导入

Cocoapods - 使用 Swift 3.0 编译的模块无法在 Swift 3.0.1 中导入

SwiftyJson 无法导入在 3.0.2 中使用 Carthage 编译的 Swift 3.1 模块中