为什么@unknown默认值(Swift 5)导致编译错误?

时间:2019-04-09 04:26:33

标签: ios swift swift5

我想我了解@unknown默认值背后的逻辑,我为屏幕快照而不是代码表示歉意,但这是在上下文中查看错误消息的唯一方法。

将项目转换为Swift5。它可以运行,但是会收到此警告,据我了解:

enter image description here

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

enter image description here

我更改了存根大小写的顺序(这是一项正在进行的工作),这使编译器再次感到高兴:

enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

通常,编译器期望@unknown default是最后一种情况。请查看@unknown documentation from apple,他们在其中解释了为什么必须在开关的最后一种情况下使用它,并在以下引号中的“未知模式”链接上提供了更多信息:

  

@unknown只能应用于默认值或包含   单一模式_。即使在后一种情况下,也必须将 @unknown与   交换机中的最后一种情况。此限制将在下面进一步讨论   “未来方向”下的"unknown patterns"部分。

答案 1 :(得分:0)

在许多情况下,裸露的return后跟另一行代码会导致Swift认为您正在尝试返回该行代码。这种情况不像以前那样令人困惑,因为现在至少有一个警告可以告诉您(并且这种情况的发生范围比以前要小得多):

@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之后添加分号实际上也是一种反射动作。

您的情况基本上是同一问题的情况。问题是您没有得到解释性的警告。