详尽的开关

本文关键字:开关 | 更新日期: 2023-09-27 18:32:45

我最近开始学习 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 选择了一些与其他语言不同的东西,否则就不需要新的语言了。

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

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