为什么@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
之后添加一个分号实际上是一种反射动作,尽管现在通常不再需要它.
你的情况基本属于同一个问题。问题是您没有收到解释性警告。
我想我理解@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
之后添加一个分号实际上是一种反射动作,尽管现在通常不再需要它.
你的情况基本属于同一个问题。问题是您没有收到解释性警告。