3

在 WWDC 2019 session 402 " What's New in Swift " 中,演讲者在讨论 Swift 5.1 功能Opaque Result Type (SE-0244)时提到该功能仅适用于新操作系统:

需要新的 Swift 运行时支持

    适用于 macOS Catalina、iOS 13、tvOS 13、watchOS 6 及更高版本

    Guard 在部署到早期操作系统版本时使用可用性检查

在 Xcode 11 中,如果我在针对 iOS 11 及更高版本时使用此功能编写代码,我不会收到任何构建错误(或警告)。我没有在if #available(iOS 13.0, *)检查中包装任何代码。例如:

protocol Shape { }
class Square: Shape { }
class Triangle: Shape { }
    
func foo() -> some Shape {
    return Square()
}

然后foo()从我的应用程序中的一些代码调用。

如果此代码在 iOS 13 之前的设备上运行会发生什么?缺少构建错误本身是错误吗?是否有明确的清单列出哪些 Swift 5.1 功能需要新的运行时支持,以及特定的操作系统版本?

4

1 回答 1

9

缺少构建错误本身是错误吗?

是的。并且有明确的记录。正如发行说明清楚地告诉您的那样:

带有some协议返回类型的声明需要 iOS 13、macOS 10.15、watchOS 6 或 tvOS 13 中的 Swift 5.1 运行时,但 Swift 编译器不强制执行此操作。some在以前的操作系统版本上运行使用返回类型的应用程序可能会在运行时崩溃……解决方法:仅将使用some返回类型的二进制文件部署到 iOS 13、macOS 10.15、watchOS 6 和 tvOS 13。避免在必须运行的代码中使用它们以前的操作系统版本。

所以,按照你的吩咐去做:使用availability警卫或准备死亡。

编辑此错误现已修复,这意味着some返回类型的可用性由编译器强制执行:

在此处输入图像描述

于 2019-06-09T23:20:12.330 回答