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

87
我将Xcode升级到了8.1 GM版本,现在在使用SwiftyJSON时遇到如下错误。其他导入的框架似乎可以正常工作。有没有办法让它在Swift 3中强制运行,直到SwiftyJSON更新他们的框架为止?我使用Carthage来导入/更新框架。我还尝试了开启和关闭“使用旧版Swift语言版本”选项,但无济于事。

使用Swift 3.0编译的模块无法在Swift 3.0.1中导入: Modules/SwiftyJSON.swiftmodule/arm64.swiftmodule

9个回答

171

SwiftyJson正在被Carthage预编译下载。预编译下载的版本适用于Swift 3.0,这会导致编译器报错版本不正确。使用以下命令:

carthage update --platform iOS --no-use-binaries

使用Carthage中的SwiftyJson(以及其他所有框架)将会使用本地版本的Swift(3.0.1)进行本地编译,编译器将不会再抱怨。


24
不客气。说实话,迦太基应该更聪明地检查 Swift 版本号。 - zirinisp
还有其他的想法吗?因为这个对我没用,虽然在我的情况下我遇到了Unbox的问题。 - Xernox
我认为你不能嵌入它。你可能可以将其添加到fastlane中,但我没有尝试过。 - zirinisp
1
我在从XCode 8.0升级到XCode 8.1后,使用PromiseKit 4.0时遇到了类似的错误。我一直遇到EXC_BAD_ACCESS错误。最终,必须使用Swift 3.0.1重新编译PromiseKit,问题才得以解决。 - Ricardo Anjos
请问我应该在哪里输入这个命令行?应该在 Xcode 文件夹中的终端吗?我收到了一个“bash:carthage:command not found”的错误信息。@zirinisp - Jibeee
显示剩余2条评论

21

从DerivedData中清除应用程序缓存,然后重新构建。这样可能会修复错误。

DerivedData的路径如下:

~/Library/Developer/Xcode/DerivedData/

对我有用,我移除了这个文件夹,移除了pod文件夹并使用“pod install”。问题已解决。 - Jose Pose S
嗨。这个解决方案对我有用。你能详细解释一下当我们清除派生数据时会发生什么吗?错误是如何消失的? - iPhoneDeveloper
我也试过了,谢谢。 - Hasya

10

请确保已将新的XCode 8.1 GM包放置在您的应用程序文件夹中。我们在更新依赖项时遇到了这个问题,其中一位同事没有替换应用程序文件夹中的旧版XCode 8.0(8.1 GM正在桌面上运行)。

请确保在终端中运行以下命令:xcrun swift -version 返回 Apple Swift version 3.0.1


这对我有用,谢谢!终端中有效的命令是 xcrun swift -version。 - HH887
2
仍然遇到相同的问题。还有其他建议吗? - harsh_v
2
这个命令对我有效:carthage update --platform iOS --no-use-binaries - HH887
2
我已经执行了 carthage update --platform iOS --no-use-binaries,但仍然无法正常工作。我已经清理了我的项目并重新启动了 Xcode,但仍然出现错误。还有其他我可以尝试的方法吗? - Clifton Labrum
1
我尝试了一下。它返回Apple Swift版本3.0.1(swiftlang-800.0.58.6 clang-800.0.42.1)目标:x86_64-apple-macosx10.9 - Clifton Labrum
显示剩余3条评论

9

我在终端上更新默认的Xcode到新版本,这对我很有效。

步骤1:使用以下命令在终端上将Xcode版本更新为最新版本。 参考链接

sudo xcode-select -switch <path/to/>Xcode.app

步骤二:现在尝试执行carthage update命令。

carthage update --platform iOS

9

最新的更新如下:

Carthage在2017年2月27日发布了0.20版本

现在,只有当预构建二进制文件兼容时,Carthage才会使用预构建二进制文件。

也就是说,您不再需要使用 --no-use-binaries 来避免不兼容的预构建框架。

因此,请确保您的Carthage版本大于0.20,然后只需执行以下操作:

carthage update --platform iOS

XCode 8.3.3将Carthage更新到0.25版本后,执行以下操作即可解决问题:carthage update --platform iOS --no-use-binaries - anoop4real
@anoop4real 如果没有使用 --no-use-binaries,这对您不起作用吗?Carthage 应该能够检测二进制文件是否与您的编译器版本兼容。如果不兼容,它应该自动放弃已下载的二进制文件并在本地构建框架。 - kanekin

5

就像@zirinisp所说的:

  1. 您可以使用以下命令:carthage update --platform iOS --no-use-binaries
  2. 使用以下命令:xcrun swift -version查看Swift版本
  3. 执行以下操作:Xcode->preferences->locations清除派生数据和档案数据,最重要的是将命令行工具更改为"Xcode 8.1"
  4. 使用以下命令:xcrun swift -version,您可以看到Swift版本是3.0.1
  5. 设置Use Legacy Swift Language Version = NO

希望这能帮助到您


1
  1. 将 Xcode 的 beta/GM 版本移动到 /Applications 文件夹并将其命名为 Xcode-beta

  2. 在终端中运行以下命令检查输出:

    xcrun swift --version

该命令的输出应与您想要编译应用程序的 Swift 版本匹配,因为 Carthage 使用此命令的输出来确定本地的 Swift 版本。

  1. 通过运行以下命令在终端上更新 Xcode 版本至最新版本:

    sudo xcode-select -s /Applications/Xcode-beta.app/

  2. 通过运行以下命令构建 iOS 库并防止 Carthage 下载现有(但不兼容)的预编译二进制文件:

    carthage update --platform iOS --no-use-binaries

  3. 清理并构建


0

我在使用库XCTest_Gherkin时遇到了完全相同的问题,下面是我的解决方法:

  1. Product -> Scheme -> XCTest-Gherkin
  2. Product -> Build

希望能帮到你。我是使用Cocoapods。


0
在 Xcode 的构建设置中,确保你的框架搜索路径包含适当的 Carthage 构建文件夹:
$(inherited)
$(PROJECT_DIR)/Carthage/Build/iOS

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