【问题标题】:Exhaustive switches详尽的开关
【发布时间】:2014-12-01 00:11:21
【问题描述】:

我最近开始学习 Swift,遇到了一个 Swift 开关,例如,开关在 Swift 中似乎必须是详尽无遗的。

这会导致编译器错误

let nums = 1...5
for num in nums 
{
    switch num
    {
       case 2:
           // Do Something
       // Will throw a comilation error unless default: was added
    }
}

在 C# 中,这是完全可以接受的

var nums = new[] {1, 2, 3, 4, 5};
foreach (var num in nums)
{
    switch (num)
    {
        case 2:
            // Do Something
            break;
    }
}

这只是基础设施偏好还是有其他原因?

【问题讨论】:

  • 您是在问为什么需要在 swift 中添加默认值,或者为什么不需要在 c# 中添加?
  • 是的,我觉得很奇怪,为什么 C# 允许这样做而 Swift 却不允许,因为 switch 似乎是每种语言中非常基本的关键字

标签: c# swift switch-statement


【解决方案1】:

Swift 选择了一些不同于其他语言的东西,否则就不需要新的语言了。

对于 switch 尤其如此,例如除非被明确告知,否则选择不fallthrough。这允许它从其他类 C 语言中省略普遍存在的break(顺便说一句,我认为这是一个很好的选择。考虑到我很少希望我的case 失败)。

对于switches,语言需要default 也并非闻所未闻,例如对于Java,当打开enums 时,如this question。在这种情况下,我通常会认为这是一件好事,否则我可能会忘记在一些随机的switch 语句中添加一个案例,我打算在其中涵盖enum 或范围的所有值如果enum 最终得到一个额外的元素。通过这种方式,我有一种方法来表达这一点(通过不实现 default 子句),我认为它优于没有这种可能性(通过简单地假设“无事可做”,就像 C# 的情况一样)。

【讨论】:

  • 为了完整起见,C# 也不允许“失败”。 stackoverflow.com/questions/3047863/…
  • 感谢您的澄清。我对 C# 的了解不够,无法做出这种区分,但这绝对是需要指出的。
  • 我想我的问题应该是为什么 Swift 选择不失败或允许休息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2018-07-25
  • 2019-06-16
  • 1970-01-01
  • 2016-10-06
相关资源
最近更新 更多