【问题标题】:Why does @unknown default (Swift 5) cause compile error?为什么@unknown default (Swift 5) 会导致编译错误?
【发布时间】:2019-08-30 07:01:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 请勿使用图片粘贴代码。直接粘贴代码。
  • 这样做只是为了让读者可以在上下文中看到错误消息。
  • 这是一个已知的错误SR-9920

标签: ios swift swift5


【解决方案1】:

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

通常编译器期望@unknown default 是最后一种情况。检查@unknown documentation from apple,他们解释了为什么它必须与开关中的最后一个案例一起使用,以及以下引用中“未知模式”链接的更多信息:

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

【讨论】:

  • 中间的例子怎么不是最后一个例子?
  • 您是否尝试在中间示例中将; 放在return 的末尾,例如:return;
  • 深夜,没想到。谢谢,刚刚试了,可以的。仍然认为这是一个 Xcode 错误,因为 Swift 非常重视没有分号。
  • 是的,我猜是新的 swift 5 更改的 xcode 错误。我已将其添加为答案中的声明,以确保为未来的读者正确解决它:)
  • “仍然认为这是一个 Xcode 错误,因为 Swift 非常重视没有分号”这不是真的。在许多其他情况下,您需要在 return 之后使用分号,以防止编译器认为您正在尝试返回下一行。
【解决方案2】:

在很多情况下,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 之后添加分号实际上是一种反射动作,尽管现在通常不再需要它。

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

【讨论】:

  • 有没有相关文档?因为它看起来像一个 xcode 错误
  • 您给出的示例略有不同——即return 后跟一个有效的表达式。 OP 的情况是 return 后跟一个语句,Swift 应该能够将其视为一个裸返回,后跟一个语句(而不是试图将语句解析为表达式)。这是一个错误 (SR-9920),which has already been fixed :)
  • @Hamish 我将示例更改为更引人注目的示例。
  • @matt 这仍然是返回后的表达式 - 考虑其他情况下语句跟随返回,例如 gist.github.com/hamishknight/b3014d64a8a9f820e29076ce0a211370,编译器会正确处理这些情况。
  • @Hamish 我认为他们应该全部在没有错误或警告的情况下编译。
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2018-04-08
  • 2020-04-26
  • 2016-05-13
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多