Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性。使用Switch语句很简单:
var i = 0 switch i { case 0: "0" //被输出 case 1: "1" default: "2" }在这个最简单的Switch语句中,与其他语言很不同的一点是:不用显式的加上break。Swift的Switch语句会自动在case结尾处加上break,执行完满足条件的case部分后,就自动退出了。但是在某些情况下,我们可能会希望Switch能同时执行两条case,那么可以这样:
var i = 3 switch i { case 0,3: "0" //被输出 case 1: "1" default: "2" }在case后的多个条件中,用逗号隔开即可。
如果就是想执行完一条case之后,想继续执行下一条case,就要用到一个新的关键字:
var i = 0 switch i { case 0: "0" //被输出 fallthrough case 1: "1" //被输出 case 2: "2" default: "default" }
使用新的关键字fallthrough能使Switch在执行完一个case之后,紧接着执行下一条case。
Swift的Switch语句一定要涵盖所有的情况,这并不是说一定要有default,只要上面的case能满足所有的情况,就可以不用写default。
需要注意的地方有两点:
let float = 1.5 switch float { case 1.5: "1.5" //被输出 default: "default" }支持布尔:
let isSuccess = true switch isSuccess { case true: "true" //被输出 default: "default" }支持字符串:
let name = "Bannings" switch name { case "Bannings": "Bannings" //被输出 default: "default" }可以说是史上支持数据类型最多的Switch了。
var i = 15 switch i { case 0 ... 10: "0~10" case 11 ... 20: "11~20" //被输出 default: "default" }对某个数值区间进行批量匹配,这样是不是很酷?浮点数也同样支持区间运算符。
let request = (true,"success") switch request { case (true, "success"): "success" //被输出 case (false, "failed"): "failed" default: "default" }使用元组和使用其他数据类型一致,不过元组还有一项特点,对于不想关心的值,可以用下划线_跳过,如:
let (name, _, age) = ("Bannings" ,true, 22)那么在使用Switch时,同样支持这项特性:
let request = (true,"success") switch request { case (_, "success"): "success" //被输出 case (false, _): "failed" default: "default" }对于不关心的值跳过,只要满足另一个值就行了。需要注意一点的是,如果元组中的值也是数字类型,那么也是可以用区间运算符的:
let request = (10,"failed") switch request { case (_, "success"): "success" case (1 ... 10, _): "1~10" //被输出 default: "default" }
let request = (0,"success") switch request { case (0, let state): state //被输出:success case (let errorCode, _): "error code is \(errorCode)" } // 涵盖了所有可能的case,不用写default了这样也是可以的:
let request = (0,"success") switch request { case let (errorCode, state): state //被输出:success case (let errorCode, _): "error code is \(errorCode)" }把let放在外面和放在里面为每一个元素单独写上let是等价的。
let request = (0,"success") switch request { case (0, let state) where state != "success": state case (let errorCode, _): "error code is \(errorCode)"//被输出:"error code is 0" }这同样很酷,相信在某种情况下会派上大用场。