在 Xcode/Cocoapods 项目中更新 swift 版本的正确方法是什么?

What is the correct way to update swift version in Xcode/Cocoapods project?

我有一个 Xcode 项目,其中包含用 Swift 4.2 编写的 cocoapods (RealmSwift)。

我已将 Xcode 更新为 10.2,现在系统提示我将我的代码(和 RealmSwift 代码)转换为 Swift 5,以及一大堆警告正在为领域 Swift 生成(即 'public' 修饰符对于在 public 扩展中声明的实例方法是多余的)。

更新Cocoapods代码的正确方法是什么?我是否需要 specify/upgrade 到较新版本的 RealmSwift(我怎么知道它与 Swift 5 兼容?),或者是否有推荐的方法来抑制警告,如果我不想升级到 Swift 5?

如能提供有关处理 xcode/swift/cocoapods 更新的最佳方式的文档的任何指示,我们将不胜感激。

更新 Xcode 版本时,您应该确保不会陷入无法工作的境地。

您可以在同一个 mac 上安装两个版本的 Xcode,而不是更新 Xcode,然后通过试用新版本来使用它们。

现在,您可以通过在此处 https://developer.apple.com/download/more 下载以前的版本返回到以前的 Xcode,解压缩您要下载并复制的存档应用程序文件到 macOS.

中的应用程序文件夹

在开始升级所有内容之前,我建议的解决方案是删除 Xcode 10.2 并返回,因为您不知道所有新的 pod 更新将如何与您的代码实现一起工作安装 10.1 或 10.0(可以从之前的 link 下载)。

稍后,当您的项目构建良好且稳定时并且您想尝试升级所有内容(Xcode、Swift 和PODs),你应该首先检查你的项目是否使用你当前的 Swift 版本构建(哪个 Swift 版本是你当前设置的项目,你可以在 Target > Build Settings > Swift 语言版本).

目前您的项目尚未构建,因此请使用以前的 Xcode 版本构建您的项目,让您的生活更轻松,并确保通过升级一切您不会结束其他 PODs 的损坏功能可能改变了它们的实现与您的项目一起工作的方式。

当您的项目构建没有错误并且您想升级到新版本 Swift

  • 研究您的 PODs 的最新版本以及它们支持哪个 Swift 版本(转到项目 github 页面,或在可可pods)
  • 尝试只升级您的项目而不升级您的 PODs,如果可行,您将同时升级您的 PODs稍后,为确保您的 PODs 与适用于您的当前 Swift 版本保持一致(假设现在 Swift 3.2 例如 ) 你将这段代码添加到你的 Podfile:

    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['SWIFT_VERSION'] = '3.2'
        end
      end
    end
    
  • 要仅将您的项目转换为较新的 Swift 版本 转到 Edit -> Convert -> Convert to current swift syntax 将出现一个包含目标列表的弹出窗口,包括 pods。取消选择除项目目标、单元和 UI 测试之外的所有内容,然后按转换。等待项目构建并生成预览并应用更改。修复由新 Swift 版本要求引起的所有问题和警告。

  • 要更新所有支持新 Swift 版本的 PODs, 您升级了项目,请使用正确的每个支持较新 Swift 版本的 POD 的 POD 版本以及不支持较新 Swift 版本的 POD 版本,您可以用此 [=15= 替换 Podfile 上的代码片段]

    post_install do |installer|
        installer.pods_project.targets.each do |target|
            if ['UnsupportedPod1', 'RxSwift', 'RxCocoa'].include? target.name
                target.build_configurations.each do |config|
                    config.build_settings['SWIFT_VERSION'] = '3.2'
                end
            end
        end
    end