我刚开始学习Objective C,但我不懂开关。有人可以向我解释一下吗?
谢谢
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 语句。案例“默认”匹配除您明确列出的案例之外的所有其他案例。
(Objective-)C(和 C 系列的其他成员)中的 switch 语句是计算的 goto(或跳转/*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。