为什么@unknown default (Swift 5) 会导致编译错误?

Why does @unknown default (Swift 5) cause compile error?

我想我理解@unknown default 背后的逻辑,我为屏幕截图而不是代码道歉,但这是在上下文中查看错误消息的唯一方法。

将项目转换为 Swift 5。它运行,但收到​​此警告,我的理解是:

所以我让 Xcode 为我修复它,得到了这个:

我更改了存根案例的顺序(这是一项正在进行的工作),这让编译器再次开心:

我是在做不该做的事情,还是这种奇怪的编译器行为?

中间图片的错误看起来像bug in swift,可以通过在return语句末尾添加分号来解决。

通常,编译器期望 @unknown default 是最后一种情况。检查 @unknown documentation from apple 他们解释为什么它必须与 switch 中的最后一个案例一起使用,以及更多关于 "unknown patterns" link 的引用:

@unknown may only be applied to default or a case consisting of the single pattern _. Even in the latter case, @unknown must be used with the last case in a switch. This restriction is discussed further in the "unknown patterns" section under "Future directions".

在很多情况下,空 return 后跟另一行代码会导致 Swift 认为您正在尝试 return 该行代码。这种情况不像以前那样令人困惑,因为现在至少有一个警告告诉你(而且这种情况出现的情况比以前小得多):

@IBAction func doDismiss(_ sender: Any) {
    return
    self.presentingViewController?.dismiss(animated:true)
}

该代码看起来合法,但无法编译,结果是一个看似奇怪的编译错误:

Value of optional type 'Void?' must be unwrapped to a value of type ‘Void'

幸运的是,在这种情况下,奇怪的原因现在也通过警告(通常)揭示出来:

Expression following 'return' is treated as an argument of the 'return'

解决办法一直是在return后面加一个分号。事实上,对于我们这些自 Swift 1 以来一直使用 Swift 的人来说,在 return 之后添加一个分号实际上是一种反射动作,尽管现在通常不再需要它.

你的情况基本属于同一个问题。问题是您没有收到解释性警告。