Swift 5.1不透明结果类型如何与旧版操作系统(例如iOS 12)进行交互

And*_*net 1 xcode ios swift swift5.1

在WWDC 2019会议402“ Swift的新增功能 ”中,演讲者在讨论Swift 5.1功能“ 不透明结果类型”(SE-0244)时,提到该功能仅适用于新的OS:

需要新的Swift运行时支持

    在macOS Catalina,iOS 13,tvOS 13,watchOS 6和更高版本上可用

    在部署到较早的OS版本时,Guard与可用性检查配合使用

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

protocol Shape { }
class Square: Shape { }
class Triangle: Shape { }

func foo() -> some Shape {
    return Square()
}
Run Code Online (Sandbox Code Playgroud)

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

如果此代码在iOS 13之前的设备上运行会怎样?缺少构建错误本身就是错误吗?是否有明确的清单说明哪些Swift 5.1功能需要新的运行时支持,因此需要特定的OS版本?

mat*_*att 6

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

是。并有明确记录。由于发行说明明确地告诉你:

具有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返回类型的可用性由编译器强制执行:

在此处输入图片说明

  • 整个“语言”事物(!)怎么可能需要“iOS13”? (3认同)