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;
}

results matching ""

    No results matching ""