【问题标题】:Enforcing compatibility with Swift 5.2 in Xcode 12在 Xcode 12 中强制兼容 Swift 5.2
【发布时间】:2023-04-09 17:20:02
【问题描述】:

有没有办法在 Xcode 12 中强制与 Swift 5.2 兼容,这样我就不会意外引入不再使用 Swift 5.2 编译的代码?

我想使用 Xcode 12 Beta 来开发 iOS 13 应用程序,因为 SwiftUI 的错误消息得到了极大改进,并且自动完成功能也更好。但我需要让项目与 Swift 5.2 完全兼容,以便实际使用 Xcode 11 构建产品。

Swift 5.3 中的 Allow implicit self in escaping closures when self is explicitly captured 等功能在 Swift 5.2 中无法编译,例如:

class SomeViewController : UIViewController {

    func bar() {       
        UIView.animate(withDuration: 1) { [self] in
            foo()
        }
    }
    
    func foo() {
    }

}

SWIFT_VERSION 构建设置只允许指定主要版本,但不能指定“5.2”之类的内容。

【问题讨论】:

    标签: swift xcode


    【解决方案1】:

    您可以将代码包装在 #if compiler 块中。例如:

    func bar() {       
      UIView.animate(withDuration: 1) { [self] in
         #if compiler(>=5.3)
           foo()
         #else
           self.foo()
         #endif
      }
    }
    

    对于上述情况,这可能是矫枉过正,最好不要依赖SE-0269

    func bar() {       
      UIView.animate(withDuration: 1) {
        self.foo()
      }
    }
    

    或者,您可以从 swift.org 下载旧的工具链并使用它。但是,请记住,您将无法使用非默认工具链将应用提交到 App Store。

    因此,我认为最好的做法是要么不使用依赖于较新编译器的功能,要么并排安装 Xcode 11 来开发 iOS 13 应用。

    【讨论】:

    • 这不是我的意思——我不想让这段代码在两个 Xcode 版本中都编译,而是将 Xcode 12 限制为 Swift 5.2 的功能集(并显示与 Xcode 11 相同的错误)所以我不能随意引入不再使用 Swift 5.2 编译的代码。
    • 如上所述,您可以从 swift.org 下载较旧的工具链。例如,您可以下载 Swift 5.2.4 工具链并将其与 Xcode 12 一起使用。但是,您将无法提交使用该工具链编译的应用程序,即您必须在上传之前切换回默认工具链应用程序。无论如何,如果您将工具链切换到旧版本,您还将失去上面提到的许多功能,例如改进的 SwiftUI 错误和快速自动完成,因为它们依赖于较新的编译器,而不是较新的 IDE。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多