Swift Switch介绍

Switch简介

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。

需要注意的地方有两点:

  • Switch当然也支持显式的break,通常只有一种情况下你会这么做,那就是当你也不想在default里做任何事情的时候,这个时候你就可以在default里显式地加上一句break。
  • fallthrough并不是在任何情况下都有效,当你在Switch里使用Value Binding技术的时候,fallthrough就被禁止了。Value Binding在下面会讲到。

支持多种数据类型

在Objective-C里,Switch语句只能支持整形的数据(或者一个字符),但是在Swift里,Switch能支持多种数据类型,包括浮点、布尔、字符串等:

支持浮点:

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了。

支持区间运算符

不仅仅是循环结构里可以用区间运算符,在Switch里同样可以用区间运算符:

var i = 15
switch i {
    case 0 ... 10:
        "0~10"
    case 11 ... 20:
        "11~20" //被输出
    default:
        "default"
}

对某个数值区间进行批量匹配,这样是不是很酷?浮点数也同样支持区间运算符。

支持元组

作为被大大增强的Switch,元组也是被支持的:

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

Value Binding

针对元组,Switch还支持类似于Optional Binding的Value Binding,就是能把元组中的各个值提取出来,然后直接在下面使用:

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是等价的。

当你在一个case里使用Value Binding的时候,如果你同时也在它的上一个case里使用了fallthrough,这是编译器所不允许的,你可能会收到这样一个编译错误:

 

只要把下面的errorCode去掉就行了,当然,考虑好自己的逻辑。

支持额外的逻辑判断

在使用Switch语句时,Switch会适当地导向相应的case部分,这其实就相当于做了一次逻辑判断,但Swift的Switch语句还支持额外的逻辑判断:

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

这同样很酷,相信在某种情况下会派上大用场。

总结

Swift对Switch进行了大大增强,使Switch的灵活性得到了很大提升,这是激动人心的改变,但是如果掌控不好其中的变化,可能会使你在进行错误排查时增加难度,也会使代码复杂度变高。在适当地时候灵活运用,保持头脑清晰总是有益的。

时间: 2024-10-07 05:51:35

Swift Switch介绍的相关文章

Swift开发中switch语句值绑定模式_Swift

 Switch简介 Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性. // switch语句值绑定模式 let point = (100, 10) switch point { // 遇到有匹配的就不会在执行下一个了 这样子也可以啊case let (x, y) case (let x, let y): print("\(x): \(y)") //

Swift中swift中的switch 语句_Swift

废话不多说了,直接给大家贴代码了,具体代码如下所示: /** switch 语句 */ let str = "aAbBacdef" let str2 = "aAbBadef" let str3 = "aAbBadeff" // var array = []; for c in ["A", "a", str3] { switch c { // case "a": case "a&

举例讲解Swift编程中switch...case语句的用法_Swift

Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性.使用Switch语句很简单: var i = 0 switch i { case 0: "0" //被输出 case 1: "1" default: "2" } 在这个最简单的Switch语句中,与其他语言很不同的一点是:不用显式的加上break.Swift的S

深入解析Swift中switch语句对case的数据类型匹配的支持_Swift

Swift可以对switch中不同数据类型的值作匹配判断: var things = Any[]() things.append(0) things.append(0.0) things.append(42) things.append(3.14159) things.append("hello") things.append((3.0, 5.0)) things.append(Movie(name:"Ghostbusters", director:"Iv

Swift编程中的switch...case语句实例解析_Swift

Swift中的switch...case语句可以判断对象类型, Objective-C中则必须是整数. 不可以穿透,可以不写break, var rank = "A" switch rank{ case "A": //相当于if print("优") case "B": // 相当于else if print("优") case "C": // 相当于else if print(&quo

详解Swift的switch...case语句中break关键字的用法_Swift

与Objective-C中这部分内容相比,在Swift中switch得到了极大的改善.这是一件非常有趣的事,因为这还是没有添加到Objective-C中,还是没有打破Objective-C是C的超集的事实. 第一件令人兴奋的地方是可以对字符串转换.这也许正是你之前想要做,却不能做的事.在Objective-C中如果要对字符串用"switch",你必须要使用多个if语句,同时要用isEqualToString:,像下面这样: if ([person.name isEqualToStrin

从 Objective-C 到 Swift —— Swift 糖果 【已翻译100%】

Swift带来很多确实很棒的特性,使得很难再回到Objective-C.主要的特性是安全性,不过这也被看成是一种额外副作用. 带类型接口的强型别 Swift有强型别,这意味着除非你要求,不然Swift不会为你做类型之间的转换.所以,例如你无法把Int型赋给Double型.你不得不首先转换类型: let i: Int = 42 let d: Double = Double(i) 或者你必须给Double类扩展一个方法用来转换Int型: extension Double { func __conve

Switch语句的技巧_Swift

概述 switch语句对一个表达式求值,将结果与 case 子语句比较,如果匹配,则从 case 处的语句向下执行. 语法 break;语句是可选择的,如果遇到break;则会跳出整个switch语句.如果没有任何case匹配,则进入到default:的分支.default:分支也是可选的. switch (expression) { case value1: // 当 expression 的结果与 value1 匹配时,从此处开始执行 statements1: [break;] case v

《Swift权威指南》目录及其源代码下载

源代码 目录 第1章  未来的iOS开发语言Swift 语言介绍 1 1.1  Swift语言的前世今生 1 1.2  Swift到底是怎样的一种语言 2 1.3  Swift开发环境搭建 5 1.4  创建Swift工程(OS X和iOS平台) 6 1.5  瞧一瞧Swift到底长啥样 8 1.6  所见即所得的Playground 11 1.7  小结 13 第2章  千里之行始于足下--Swift语言 基础 14 2.1  Swift语句和分号 14 2.2  变量和常量 15 2.2.1