使用Swift 4.0编译的模块无法在Swift 4.0.1中导入。

92

然而,我已经使用同样的Xcode重新编译了框架,但仍然出现这个错误。

  • 基础SDK为iOS 11.1,两者相同
  • Swift语言版本为Swift 4.0,两者相同
  • 没有使用Pods/Carthage

希望有人能知道原因。


似乎苹果需要重新考虑对Objective C的10年弃用通知:^)这已经在我超过1个项目中出现了问题,并且这些都是第三方二进制框架。 - Anton Tropashko
https://dev59.com/OVMI5IYBdhLWcg3wyunE#60911546 - Codetard
9个回答

142

更新:

对于Xcode的发布版本:

当使用早期版本的Xcode工具构建的框架打开一个项目时,会出现这个错误(以及涉及Swift 4.1、4.2等的类似错误)。

要解决这个问题,需要使用Carthage(carthage update --platform iOS)、Cocoapods(pod updatepod install)或手动更新和重建框架,使用新的更新后的Xcode工具。当您更新Xcode时,工具应该会自动更新,但如果没有,您可以按照下面原始答案中概述的步骤进行操作。

您可能还需要清除项目cmd + shift + k和可能的构建文件夹cmd + option + shift + k,以使Xcode不使用缓存的框架构建。

在某些情况下,您可能还需要删除派生数据文件夹(通过进入Xcode首选项->位置->派生数据文件夹轻松找到感谢Stunner)。

对于Xcode的beta版本:

请参见下面的原始答案,然后按上述步骤操作。

原始答案:

您可能仍将xcodebuild工具设置为Xcode 9.0,该版本使用Swift 4.0构建,并与Xcode 9.1 beta的Swift 4.0.1不兼容。

使用以下命令在终端中进行检查:

xcodebuild -version

或者只需进入Xcode首选项->位置,检查/更改命令行工具为Xcode 9.1。然后您应该就可以了。


1
我也清除了派生数据并清理了项目,不知道对每个人是否必要,但在这里似乎是必须的。谢谢。 - Simon
3
嗨@Zig。我在GitHub上使用的一个仓库(mattdonnelly/swifter)是用Swift 4.0编写的,但显然是使用XCode 9.0进行编译的,所以我遇到了这个问题。重新编译别人在GitHub上的cocoapod需要哪些步骤才能在XCode 9.1及以上版本上运行? - Joseph Beuys' Mum
1
有没有一种方法可以添加命令行工具?我在我的命令行下拉菜单中只有Xcode 9.3。我也遇到了这个问题。 - tara tandel
1
我的一些Pods还没有准备好支持Swift 4.2,因此我不得不将“Swift语言版本”固定为“Swift 4”。然后它就可以工作了。 - skofgar
1
加一分,因为清理构建文件夹的快捷方式——这不是我能够轻易知道的东西。 - Matt
显示剩余3条评论

27

我的问题是由于一个外部框架没有为Swift 4.0.2编译。我通过Carthage添加了这个文件,所以运行:

carthage update --platform iOS

然后清理项目 cmd + shift + k 和构建文件夹 cmd + option + shift + k,并删除派生数据文件夹(仅将其移动到垃圾桶也可以),这对我有用。


2
确实,这基本上就是解决方案。同样的事情今天(4月18日)刚刚发生了,因为苹果最新的Swift更新! :) - Fattie
更新 Carthage 后,cmd + option + shift + k 终于解决了问题。谢谢! - Leonardo Leite

15

在我的情况下,我下载了xCode 11 Beta版本来测试SwiftUI。当我运行我的项目时,我遇到了"Module compiled with Swift 5.1 cannot be imported by the Swift 5.0.1 compiler:..."错误。

为了解决这个问题,我将xCode命令行工具更改为新的xCode 11命令行工具。之后,您可以使用SwiftUI创建新的xcode项目。

Xcode -> Preferences -> Location -> XCode command Line Tool

Xcode Commend Line Tool

我希望这能帮助那些想要测试新框架的人 :)


9
请安装您之前使用过的特定版本Xcode的工具链,您可以从这里下载。

Xcode工具链包括编译器、lldb和其他相关工具,为在特定版本的Swift中开发提供一致的开发体验。

打开Xcode首选项,导航到组件>工具链,并选择已安装的Swift工具链。

这将允许您编译和运行该应用程序。


在搜索了2天并尝试了每一个可能的解决方案,包括更新Carthage、引导程序、Swift语言设置等后,我在这里找到了正确的答案 :) - memres

7
我在Xcode 10 beta中遇到了这个问题,它添加了Swift 4.2。我的问题与Carthage或任何外部依赖项无关。
转到所有Xcode目标的“YourTarget> Build Settings> Swift语言版本”。
我的所有设置都为“Swift 4”。
添加“复制文件构建阶段”后,我开始出现错误
:0:错误:使用Swift 4.2编译器无法导入使用Swift 4.1.2编译的模块:/Users/user/Library/Developer/Xcode/DerivedData/MyApp-faskfrihumfcdibjxisjvbfshppp/Build/Intermediates.noindex/MyApp.build/Debug/MyAppExtension.build/Objects-normal/x86_64/MyClass〜partial.swiftmodule 命令MergeSwiftModule失败,退出代码为非零
然后将每个目标的'Swift Language Version'设置为'Swift 4.2',这消除了错误。
虽然将所有目标设置为'Swift 4'应该同样有效,但我不确定为什么首先会出现这个错误。

1
我在寻找“构建设置”方面遇到了困难。 - Chandrew
@Chandrew 先点击您的目标。已更新答案。 - pkamb

3
在我的情况下(Xcode 9.2):
我打开了Xcode的“偏好设置 > 地址 > 派生数据”。
然后我删除了数据并执行了清理构建,一切都正常了。

1
在我的情况下,我使用了带有插件的CocoaPods来将库预构建为二进制文件。 在我将Xcode从10升级到11后,Xcode给了我这个错误:
Module compiled with Swift 5.0.1 cannot be imported by the Swift 5.1 compiler

我通过删除 /Pods 目录并运行 pod install 来解决它。

0
在我的情况下,我重新编译了框架,使用它所抱怨的版本。
重新编译,运行 pod update 或更新 Carthage(无论你使用哪一个),然后构建项目。
然后在 Finder 中搜索框架。将 theFramework.framework 复制粘贴到您的项目中,并确保选择“必要时复制项目”。再次构建项目,应该可以正常工作。

0

我用几个基本步骤解决了这个问题

  • 关闭 Xcode
  • pod deintegrate
  • 打开 Xcode 工作区
  • Command + Shift + K - 清理
  • Command + B - 构建

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接