Switch/case Switch/case 结构
在 Objective-C 里,如果只有一个语法必须保证滴水不漏,那是 switch / case 了。 原因有二:其一,Objective-C 没有 Swift 那么强大,因此你需要手动地做配置很多东西;其二,case 语句有程序出错的可能。 这与 Swift 不同,在 Objective-C 里每一个 case 语句后面总是跟着 break ,以避免程序出错。
还是先来看基础写法:
int i = 20;
switch (i) {
case 20:
NSLog(@"It's 20!");
break;
case 40:
NSLog(@"It's 40!");
break;
case 60:
NSLog(@"It's 60!");
break;
default:
NSLog(@"It's something else.");
}
敲黑板!请注意 switch(i)这里的圆括号。
现在运行这段代码,你应该在控制台看到 "It's 20!"。
但如果删除 "break;" 语句,你会看到刚才所谓的「程序出错」。在控制台里会有: "It's 20!" "It's 40!" "It's 60!" "It's something else."
在 Objective-C 中,没有 break 相当于在 Swift 中添加 fallthrough 命令。
Objective-C 也支持模式匹配,但它只能写范围区间,比如这样:先写一个数字,然后写 "..." 符号,注意符号两边都有空格,接着写另一个数字,像这样:
switch (i) {
case 1 ... 30:
NSLog(@"It's between 1 and 30!");
break;
default:
NSLog(@"It's something else.");
}
有一点需要注意。可能这只是一种特殊情况,但是万一哪天要用到呢?这一点是:你不能使用 case 结构的第一行,声明一个新的变量,如果非要这么做,就要用花括号({})把 case 结构括起来。
请用下面的代码来演示一下:
switch (i) {
case 10:
int foo = 1;
NSLog(@"It's something else.");
}
Objective-C 不要求 switch / case 结构是穷举的,这意味着 default 语句并不是必须的。因此,如果不是因为 case 之后直接声明了一个新的变量,这段代码依然是有效的。
有两种方法来解决这个问题:可以把 case 语句的内容扩上花括号,也可以先执行 NSLog()语句:
switch (i) {
case 10:
{int foo = 1;
NSLog(@"It's something else.");
}
}
switch (i) {
case 10:
NSLog(@"It's something else.");
int foo = 1;
}