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 并克隆 this 的 Swift3 分支(我相信您正在使用),并将源目录暂时复制到您的项目中它没有说明哪个版本的 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 安装,因此更安全,因为没有重叠。
我在一个项目中安装了一个 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 并克隆 this 的 Swift3 分支(我相信您正在使用),并将源目录暂时复制到您的项目中它没有说明哪个版本的 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 安装,因此更安全,因为没有重叠。