如何使用 Swift 2.3 和 3.0 编译模块?
Posted
技术标签:
【中文标题】如何使用 Swift 2.3 和 3.0 编译模块?【英文标题】:How to compile modules with Swift 2.3 and 3.0? 【发布时间】:2016-09-16 05:31:19 【问题描述】:我更新到 Xcode 8 并转换为最新的 Swift 3.0 语法。我的项目中有一些 Cocoapod,其中一些在 Swift 2.3 上(例如,一些较旧的 pod 需要将 Alamofire 设置为 v3.5,它运行 Swift 2.3)。
我已将这些 Pod 设置为使用 Legacy Swift -> 是的,但是在构建时出现错误:
Module complied with Swift 2.3 cannot be imported in Swift 3.0: /Users/....XSDK/XSDK.framework/swiftmodule/x86_64.swiftmodule
我不使用 Carthage(在其他问题中引用)。只有 Cocoapods。
我需要将我的项目转换为使用 Swift 2.3 吗?或者我可以在我的项目中使用 Swift 3.0 并且仍然使用旧的 Cocoapods?
【问题讨论】:
不幸的是,我也遇到了这个问题。好像不能编译,代码的所有者必须编译它并再次推出它。我尝试安装的 pod 在网站上推出了一个,但还没有推送到可可豆荚。 Swift 还不是 ABI 稳定的,即它不是二进制兼容的。在 ABI 稳定之前,您不能将使用 Swift 2.3 编写的框架与使用 Swift 3(或任何其他版本的 Swift)的应用程序或其他框架混合使用。 @hegranes 你找到解决这个问题的办法了吗? @KirtiParghi -- 是的,有点像。我将添加一些示例的答案。 【参考方案1】:不幸的是,由于 Swift 不是 ABI 稳定的,你不能像这样组合 pod。这样做的原因是,所有 swift pod(以及框架、dylib、.a、.o 等)在编译后都需要引用巨大的 swift 标准库。标准库依赖于语言级别,您不能在单个应用程序中包含多个 swift 标准库副本。
自 swift 3 发布以来已经过去了几个月。在这一点上,您可能想要跳转到 3。如果您发现一个尚未更新到 swift 3 的 pod,也许 fork 并更新它并提交一个 pr。作者会爱你的! :)
【讨论】:
【参考方案2】:要让旧版 cocoapods 在您的项目中运行,需要执行两个步骤。
1) 研究 cocoapod 并确保您正在安装正确版本的 cocoapod,例如,它可能不是最新版本,或者可能位于单独的分支上。
$pod 'Your Cocoapod', :git => 'https://github.com/.....', :branch => 'branch_name'
2) 在 podfile 中,设置 Swift 版本。您也可以在每个 pod 的构建设置中手动执行此操作,但此代码会自动设置。
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '2.3' # or '3.0'
#config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
end
end
end
【讨论】:
以上是关于如何使用 Swift 2.3 和 3.0 编译模块?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 3.0.1 编译的模块无法在 BuddyBuild 上的 Swift 3.0 中导入
Cocoapods - 使用 Swift 3.0 编译的模块无法在 Swift 3.0.1 中导入
我如何继续使用 Swift 2.3 而不是 3.0,Xcode 已更新且无法再构建