Swift 编译器混淆了版本 2 和版本 3

Swift compiler is confusing version 2 and 3

我在一个项目中安装了一个 cocoapod,运行 上面的转换器将其转换为 Swift 3.

问题是编译器认为我正在使用 Swift 2,并且在正确的 Swift 3 语法上抛出错误(高达 129 个错误)。例如:

internal enum Error: ErrorProtocol {
    case noCentralManagerSet
    case busy
    case interrupted
}

抛出 use of undeclared type 'ErrorProtocol'.

怎么了?

我写的 Swift 3 代码 不会 抛出编译器错误。

这是 xcodebuild -showsdks 的输出:

2016-07-01 14:16:05.850 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/WebDevSupport.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2016-07-01 14:16:05.864 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/WebDevelopment.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2016-07-01 14:16:05.911 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/WakaTime.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2016-07-01 14:16:05.944 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Rayrolling.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2016-07-01 14:16:05.967 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/CocoaPods.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2016-07-01 14:16:05.997 xcodebuild[30824:2848916] [MT] PluginLoading: Required plug-in compatibility UUID 1637F4D5-0B27-416B-A78D-498965D64877 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDs
OS X SDKs:
    OS X 10.12                      -sdk macosx10.12

iOS SDKs:
    iOS 10.0                        -sdk iphoneos10.0

iOS Simulator SDKs:
    Simulator - iOS 10.0            -sdk iphonesimulator10.0

tvOS SDKs:
    tvOS 10.0                       -sdk appletvos10.0

tvOS Simulator SDKs:
    Simulator - tvOS 10.0           -sdk appletvsimulator10.0

watchOS SDKs:
    watchOS 3.0                     -sdk watchos3.0

watchOS Simulator SDKs:
    Simulator - watchOS 3.0         -sdk watchsimulator3.0

我想我知道问题出在哪里了。您已将所有文件从 Swift2.0 直接转换为 Swift3。它不会那样工作。我建议您删除 pods 并克隆 thisSwift3 分支(我相信您正在使用),并将源目录暂时复制到您的项目中它没有说明哪个版本的 repo swift-3 可用。它应该可以解决您的问题。 :)

您可以为每个目标设置 Swift 版本:

您的项目可能设置为 Yes

SDK不参与编译过程。

有两件事可以帮助我处理此类案件。

因为 Xcode 会自动打开之前从未关闭的项目,如果您在 Xcode 7 中打开项目 A 然后打开 Xcode 8 开始新的项目 Xcode 8也会打开同一个项目 A。所以你实际上必须在 Xcode 8 中关闭项目 A,否则你会得到大量错误并且你可能认为你正在 Xcode 7 中工作,因为项目 A开了。此时项目A在Xcode7和Xcode8开放。

另外,我将我的项目文件夹命名为 projectName - Swift 2,然后将其复制并命名为 `projectName - Swift 3.

当然我们有版本控制,但为了安全起见,我喜欢 Swift 2 / 3 有两个单独的文件夹,因为在 Xcode 的两个版本中打开同一个项目可能会变得很疯狂.

由于您还必须告诉终端使用单独的目录进行 pod 安装,因此更安全,因为没有重叠。