在WWDC 2019 session 402 "斯威夫特有什么新鲜事“中,演讲者在讨论SWIFT5.1功能不透明结果类型(SE-0244)时提到,该功能只适用于新的OSes:
需要新的Swift运行时支持 macOS Catalina,iOS 13,tvOS 13,watchOS 6及更高版本 在部署到较早的OS版本时,备用保护系统使用带有可用性检查的
在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设备上,会发生什么?缺乏构建错误本身是一个错误吗?是否有一个明确的列表,哪些SWIFT5.1特性需要新的运行时支持,从而需要一个特定的OS版本?
发布于 2019-06-09 23:20:12
缺乏构建错误本身是一个错误吗?
是。它被清楚地记录下来。正如发布说明清楚地告诉您的:
带有
some协议返回类型的声明需要iOS 13、macOS 10.15、watchOS 6或tvOS 13中的SWIFT5.1运行时,但是Swift编译器没有强制执行。在以前的操作系统版本上运行使用some返回类型的应用程序可能会在运行时崩溃.解决方案:只将使用some返回类型的二进制文件部署到iOS 13、macOS 10.15、watchOS 6和tvOS 13。
所以,照你说的去做:使用availability守卫或准备死亡。
编辑这个bug现在已经修复,这意味着some返回类型的可用性由编译器强制执行:

https://stackoverflow.com/questions/56518406
复制相似问题