Switch

Switch 语句会尝试把某个值与若干个模式(pattern)进行匹配。根据第一个匹配成功的模式,switch 语句会执行对应的代码。 与 if/else 不同,switch 非常适合处理多重条件。

switch 语句必须是完备的。这就是说,每一个可能的值都必须至少有一个 case 分支与之对应。在某些不可能涵盖所有值的情况下,你可以使用默认 default 分支来涵盖其它所有没有对应的值,这个默认分支必须在switch语句的最后面。如何 case 语句已经覆盖到所有的情况,default 分支是不需要写的。

不存在隐式的贯穿

与 C 和 Objective-C 中的 switch 语句不同,在 Swift 中,当匹配的 case 分支中的代码执行完毕后,程序会终止 switch 语句,而不会继续执行下一个 case 分支。这也就是说,不需要在 case 分支中显式地使用 break 语句。这使得 switch 语句更安全、更易用,也避免了因忘记写break语句而产生的错误。

分支可以有多个值(符合匹配)

如果需要将多个值归类为一种情况,那么可以在 case 中以逗号隔开,如果匹配了这个分支的任何一个值,都会执行相应语句。

var statusCode = 404
var errorString = "The request failed"

switch statusCode {
case 400, 401, 403, 404:
    errorString = "There are something wrong with the request"
    fallthrough
default:
    errorString += "please review the request and try again"
}

上面的代码还添加了 fallthrough 的状态转移语句(control transfer statement)状态转移语句能让你修改某个控制流中的代码执行顺序。这类语句能把控制权从一块代码传到另一块代码。

在这里,fallthrough 告诉 switch 语句从一个分支的底部“漏”(fall through)到下一个分支去。如果某个匹配的分支末尾有 fallthrough 控制转移语句,它先会执行自己代码,再把控制权转移到下面紧挨的分支。紧挨的分支又会执行自己的代码,无论它跟正在检验的值是否匹配。如果那个分支的末尾也有 fallthrough 语句,它就会把控制权传递给再下一个分支,以此类推。fallthrough 语句能让你不需要进行匹配就能进入一个分支并执行其代码

区间匹配

case 分支的模式也可以是一个值的区间。

值绑定

值绑定能在某个特定分支中把待匹配的值绑定到本地的常量或变量上。这个常量或变量只能在该分支中使用

where 子句

where 能让你额外检查一些条件,只有满足这些条件后才会匹配这个分支并绑定值。这个特性可以在 switch 中创建一些动态筛选条件。

var statusCode = 200
var errorString = "The request failed with error:"

switch statusCode {
case 100, 101: 
    errorString += " Informational, \(statusCode)."
case 204:
    errorString += " Successful but no content, 204."
case 300...307: // 区间匹配
    errorString += " Redirection, \(statusCode)."
case 400...417:
    errorString += " Client error, \(statusCode)."
case 500...505:
    errorString += " Server error, \(statusCode)."
case let unknowCode where (unknowCode >= 200 && unknowCode < 300) || unknowCode > 505: // 值绑定 和 where 额外条件
    errorString = "\(unknowCode) is not a know error code."
default:
    errorString = "Unexpected error encountered."
}

使用元祖做模式匹配

let firstErrorCode = 404
let secondErrorCode = 200

let errorCodes = (firstErrorCode, secondErrorCode)

switch errorCodes {
case (404, 404):
    print("No items found")
case (404, _):
    print("First item not found")
case (_, 404):
    print("Second item not found")
default:
    print("All items foun")
}

单个条件的 if-case,让你关注关键的分支

switch 语句主要用于比较一个值和多个潜在匹配的分支。if/else 语句则对于检查单个的条件更有用。swift 还提供符合匹配,区间匹配,绑定值到本地常量或变量以及匹配元祖中的模式。有时候一个值与很多分支匹配,但是你只关心其中一种情况。这时你会忍不住使用 switch 语句。

比如,你想去检查一个 Int 类型的年龄常量来寻找特定人群,如果我只关心 18-35岁人群,使用 switch 就会如下

let age = 28

// 单个分支 switch
switch age {
case 18...35:
    print("Cool demographic")
default:
    break
}

对于 age 不是这个年龄段的人群,那么 default 分支会匹配,也并不做什么处理,它只是简单地使用 break 控制转移语句把控制流转移到 switch 外面。

注意,这里必须有 default 分支;switch 语句必须被全覆盖。如果你觉得这段代码不顺眼,那就对了。这里不需要做什么,所以用了 break。不需要做什么的时候不写代码是最好的!

Swift 提供了一种更好的方式来实现这种逻辑。if-case 语句来提供类似于 switch 语句的模式匹配能力。

let age = 28

if case 18...35 = age {
    print("Cool demographic")
}

这种语法就优雅多了,只要简单检查 age 是否在给定区间内,而不需要写一个你并不关注的 default 分支。

results matching ""

    No results matching ""