Swift 这门语言在很多方面相对于 Objective-C 都是有很大的加强,影响巨大的如 协议
、结构体
、枚举
、函数
等,这些使得 Swift 敢于宣称自己支持 面向协议的编程
和 面向函数的编程
;其实即使在一些细碎的地方,Swift 仍然有很多值得称道的点,Switch 语句就是其中一个。
Switch 在 Objective-C 中的使用
1 | typedef enum : NSUInteger { |
在 Objective-C 中,Switch 语句很多时候会搭配枚举使用,这是因为枚举在 Objective-C 中只能为整型,而 Switch 的 condition 也必须为整型。
这里的 Switch 可以总结如下几个特征:
- condition 必须为整型;
- 每个 case 必须互斥;
- 如果不希望穿透,就必须写 break。
Swift 中的 Switch
在 Swift 中,相对于 Objective-C:
- condition 不仅仅可以为整型,几乎可以为任何类型,如 String、Double,甚至是 Tuple;
- case 之间不必一定互斥,只要所有的 case 可以包含所有的情况就可以;
- 默认不能穿透;
既然不能穿透了,那么如果我们希望实现类似 Objective-C 中的穿透该怎么做呢?事实上把希望执行相同代码的情况用逗号分隔就好了。如下面的例子:
1 | let level = "A" |
其实 Swift 中是有一个穿透的关键字的,叫做 fallthrough
,之前看过有人用这个关键字模仿 Objective-C 的写法,即 Objective-C 中不写 break
的地方,Swift 中就加上 fallthrough
实现穿透。
其实这样不太好,并不是 fallthrough
最合理的使用场景,因为大多情况下只需要将不同的 case 通过逗号分隔写在一行就好了,为何还要 fallthrough
呢?
这就涉及到 Swift 中的 Switch 的另一个特征了,就是 case 之间可以不必互斥,这就是两个 case 之间可以存在公共部分,甚至一个 case 可以是另一个 case 的子集。这就给我们更多的可能性去实现之前无法实现的逻辑。
1 | let vector: (x: Int, y: Int) = (0, 0) |
上面这个例子,第一个 case 是 第二个 case 的真子集,当第一个 case 满足的时候,第二个 case 一定满足(反之不成立),这就是一个使用 fallthrough 的好时机,因为原点也在x轴上嘛。
case 语句中也不仅仅可以填写确定的值,甚至可以增加条件,如:
1 | let vector: (x: Int, y: Int) = (0, 0) |