【问题标题】:Can someone explain switching in Objective C [closed]有人可以解释在Objective C中切换[关闭]
【发布时间】:2013-07-11 00:19:37
【问题描述】:

我刚开始学习 Objective C,但我不懂开关。 谁能给我解释一下?

谢谢

【问题讨论】:

标签: objective-c switch-statement


【解决方案1】:

switch 语句是用来代替 if else 语句的

例如

int a =4;

if(a == 1)
    doSomething();
else if(a == 2)
    doSomethingElse();
else if(a == 3)
    BLAH();
else
     CaseUnaccountedFor();

相当于

int a =4;

switch(a) {
case 1:
    doSomething();
    break;
case 2:
    doSomethingElse();
    break;
case 3:
    BLAH();
    break;
default:
   CaseUnaccountedFor();
    break;
}

如果其中一个 case 匹配,switch 语句不会自动退出,这就是为什么每个 case 末尾都有一个 break 语句。案例“默认”匹配除您明确列出的案例之外的所有其他案例。

【讨论】:

  • 谢谢。这是一个很好的解释。
【解决方案2】:

(Objective-)C(和 C 系列的其他成员)中的 switch 语句是 计算的 goto(或 jump/*branch*)。

一些标量类型的表达式 - 基本上是整数类型或可以简单地转换为整数的类型 - 被评估并且其值用于选择要分支的标签在代码块内。

每个标签都是一个常数值,用case <value>:表示;或default:,如果表达式的值不存在标签,则使用它。标签本身可以在代码块中以任何顺序出现。

一旦发生跳转,执行流程将照常继续执行代码块的其余部分,包括遇到的任何标签。从以标签为前缀的一段代码传递到以另一个标签为前缀的下一段代码通常称为“失败”。

为了防止跌倒,可以使用break; 语句。这是一个跳转到代码块末尾的分支语句。通过在代码块中每个以标签为前缀的语句组的末尾使用一个break,形成了一种多选结构-switch 中的表达式的值选择一个,并且仅一个,以标签为前缀的语句组。这是一种非常常见的模式,而且确实一些其他编程语言明确提供了这种模式,并且根本不支持 C 系列的计算 goto 模型。

由于switch 中只有一个代码块,单个以标签为前缀的语句组不能包含仅对该组本地的变量声明 - 任何组中的任何声明的范围都是整个代码块。这个问题经常使初次使用的用户感到困惑,因为看似接近的并行,if/then/else 语句包含 两个 语句块,因此变量声明的范围不会跨越两个分支。

声明范围问题可以简单地通过将标签后面的语句组括在一个块中(一个大括号的语句序列)来解决,给出大纲:

case value:
   {
      sequence of statements including declarations - scope limited to this block
   }
   break;

使用此模型可提供与其他语言最接近的多项选择语句。

最后,switch 语句通常更有效,并且与if/then/else 语句的等效序列在执行和可读性方面都是如此。

HTH。

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 2014-05-18
    • 2011-05-06
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多