为什么在Swift 5中,@unknown默认值会导致编译错误?

4
我认为我理解了@unknown default背后的逻辑,我很抱歉只提供截图而不是代码,但这是唯一能让错误信息在上下文中显示的方法。
将项目转换为Swift 5。它可以运行,但会收到以下警告,我理解:

enter image description here

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

enter image description here

我改变了存根用例的顺序(这是一个正在进行中的工作),这使得编译器再次满意:

enter image description here

我是不是做了一些不应该做的事情,还是这个编译器的行为很奇怪?


2
请不要使用图像粘贴代码。直接粘贴代码即可。 - Ashish Kakkad
只是为了让读者能够在上下文中看到错误信息。 - Ron
1
这是一个已知的错误[SR-9920](https://bugs.swift.org/browse/SR-9920)。 - Hamish
2个回答

8
中间图片中的错误看起来像是swift中的一个bug,可以通过在return语句末尾添加分号来解决。
一般来说,编译器期望@unknown default是最后一个case。请查看苹果公司的@unknown文档,他们解释了为什么必须在switch语句中的最后一个case中使用它,并且在以下引用中的“未知模式”链接中有更多信息:

@unknown只能应用于default或由单个模式_组成的case。即使在后一种情况下,@unknown也必须与switch中的最后一个case一起使用。该限制在“未来方向”下的{{link3:“未知模式”}}部分中进一步讨论。


中间的例子为什么不是最后一个情况? - Ron
1
你在中间的例子中尝试过在 return 结尾处加上 ; 吗,像这样:return; - denis_lor
1
深夜了,没想到这个。谢谢,我刚试了一下,它可以工作。我仍然认为这是Xcode的一个bug,因为Swift非常强调不需要分号。 - Ron
是的,我猜这是一个与新的Swift 5变化有关的Xcode bug。我已经将它作为陈述添加到答案中,以确保未来的读者能够正确处理它 :) - denis_lor
仍然认为这是Xcode的bug,因为Swift非常强调不需要分号。但事实并非如此。在许多其他情况下,您需要在return之后加上分号,以防编译器认为您正在尝试返回下一行。 - matt

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后面添加分号几乎是一种条件反射,尽管这些天通常不再需要。

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


有没有关于这个的文档?因为看起来像是Xcode的一个bug。 - denis_lor
2
你提供的例子是一个稍微不同的情况 - 也就是一个return后面跟着一个表达式,这是有效的。OP的情况是一个return后面跟着一个语句,Swift应该能够将其视为一个裸的return后面跟着一个语句(而不是尝试将该语句解析为表达式)。这是一个错误(SR-9920),已经被修复了 :) - Hamish
@Hamish 我把示例改成了一个更有吸引力的。 - matt
1
@matt 这仍然是一个在 return 语句后面的表达式 - 考虑其他情况下语句跟在 return 后面的情况,例如 https://gist.github.com/hamishknight/b3014d64a8a9f820e29076ce0a211370 中的代码,编译器可以正确地处理这些情况。 - Hamish
1
@Hamish 我认为所有的代码都应该没有错误或警告而成功编译。 - matt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接