【问题标题】:Xcode "switch/case" statement - warning about break;Xcode "switch/case" 语句 - 关于中断的警告;
【发布时间】:2023-03-20 17:50:01
【问题描述】:

当我将 Xcode 与 Objective-C 一起使用时,经常发生在我身上的是:

我将写一个switch/case 声明。通常,为了确保语句是分开的,程序员必须确保在cases 之间存在break;s。

我经常忘记将break; 语句放入其中,因此设备不会执行所需的case,而是执行case,然后执行case它。这发生在物理设备 (iPhone 6) 和 iOS 模拟器上的每个模拟设备上。

failed 语句的语法如下所示,someInt 是一个数字,可以是 01

switch (someInt)
{
    case 0:
    {
         // some statements to execute if "someInt" is 0
    }
    case 1:
    {
         // some statements to execute if "someInt" is 1
         break;
    }
}

请注意,在case 0: 中,没有break; 语句。这会导致case 0: 执行然后 case 1 执行,而不是只需case 0 即可执行。

有没有办法可以在 Xcode 中放置一个标志,以便在我忘记 break; 语句时向我发出警告?

我知道很多程序员可能因为这个问题而困惑了几天甚至几周。

【问题讨论】:

  • 我不得不承认我个人的解决方案是避免在 Objective-C 中使用 switch 语句。这是切换(双关语)到 Swift 的原因。完全安全、可用的 switch 语句。无需休息,无需自动跌倒。
  • switch 的语法是从动态类型编程语言转向静态类型编程语言的一个原因......?
  • 静态类型当然是另一个很好的理由:)

标签: objective-c xcode switch-statement


【解决方案1】:

我认为没有编译器警告。这是因为“程序员必须确保案例之间存在breaks”。不完全正确。程序员必须确保在cases 之间有breaks,如果他希望代码不落空。 (有失败的用例。)

背景是 C 类似于汇编程序的替代品。在汇编程序中,如果您不想继续,您可以编写带有条件跳转到特定分支 (case) 并无条件跳出分支 (break) 的多选。 (顺便说一句:这也是case-branchs 没有块的原因。)

当然,这已经过时了。您可以简单地使用 Xcode 的自动代码生成或将开关替换为 if-else if-else 级联。

【讨论】:

  • 我想switch 语句可能会有一些用途,但对我来说,它没有用。
  • 是的,当然通常您希望在每个案例分支之后退出。这就是为什么 Xcode 模板包含中断的原因。正如我所说,它是 C 的一个过时特性。
【解决方案2】:

这种行为是 C 语言的隐含部分(它是 Objective C 的基础),尽管通常情况下,您不希望陷入下一个案例,无论好坏,这就是语言的方式已定义。

另一方面,Swift 不需要显式中断,因为案例不会失败。

Clang 确实定义了一个警告-Wimplicit-fallthrough,它会在您描述的情况下生成一个警告,但是 Xcode 6.3.2 中包含的 Clang 似乎不支持它。我还没有安装 Xcode 7,以检查该版本是否仍然如此。

【讨论】:

  • 我没有 Xcode 7。我的 MacBook Air 有一个 128 GB 的硬盘,作为一名开发人员,我很幸运一次能有一两个 GB 的空闲空间。跨度>
  • 也许我的英语说得不够好,但我认为这是 C 语言的一个明确(和有意)的部分。
  • 是的,我就是这么说的。 Clang 可以选择在这种情况下生成警告,但 Apple 尚未实现此功能,至少在 6.3.2 中没有
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多