我想我了解@unknown默认值背后的逻辑,我为屏幕快照而不是代码表示歉意,但这是在上下文中查看错误消息的唯一方法。
将项目转换为Swift5。它可以运行,但是会收到此警告,据我了解:
所以我让Xcode为我修复它,并得到了它:
我更改了存根大小写的顺序(这是一项正在进行的工作),这使编译器再次感到高兴:
我在做我不应该做的事情,还是这是奇怪的编译器行为?
答案 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
之后添加分号实际上也是一种反射动作。
您的情况基本上是同一问题的情况。问题是您没有得到解释性的警告。