位置:首頁 > 高級語言 > Swift教學 > Swift分支語句

Swift分支語句

分支語句

取決於一個或者多個條件的值,分支語句允許程序執行指定部分的代碼。顯然,分支語句中條件的值將會決定如何分支以及執行哪一塊代碼。Swift 提供兩種類型的分支語句:if語句和switch語句。

switch語句中的控製流可以用break語句修改,詳情請見Break 語句


分支語句語法
分支語句 → if語句
分支語句 → switch語句
 

If 語句

取決於一個或多個條件的值,if語句將決定執行哪一塊代碼。

if語句有兩種標準形式,在這兩種形式裡都必須有大括號。

第一種形式是當且僅當條件為真時執行代碼,像下麵這樣:

if condition {
statements
}

第二種形式是在第一種形式的基礎上添加 else 語句,當隻有一個 else 語句時,像下麵這樣:

if condition { statements to execute if condition is true } else {statements to execute if condition is false }

同時,else 語句也可包含if語句,從而形成一條鏈來測試更多的條件,像下麵這樣:


if condition 1 {
statements to execute if condition 1 is true
} else if condition 2 {
statements to execute if condition 2 is true
}
else {
statements to execute if both conditions are false
}
 

if語句中條件的值的類型必須遵循LogicValue協議。同時,條件也可以使用可選綁定,詳情參見可選綁定


If語句語法
if語句 → if if條件 代碼塊 else子句(Clause) 可選
if條件 → 表達式 | 聲明
else子句(Clause) → else 代碼塊 | else if語句
 

Switch 語句

取決於switch語句的控製表達式(control expression)switch語句將決定執行哪一塊代碼。

switch語句的形式如下:


switch control expression {
case pattern 1:
statements
case pattern 2 where condition:
statements
case pattern 3 where condition,
pattern 4 where condition:
statements
default:
statements
}
 

switch語句的控製表達式(control expression)會首先被計算,然後與每一個 case 的模式(pattern)進行匹配。如果匹配成功,程序將會執行對應的 case 分支裡的 statements。另外,每一個 case 分支都不能為空,也就是說在每一個 case 分支中至少有一條語句。如果你不想在匹配到的 case 分支中執行代碼,隻需在該分支裡寫一條break語句即可。

可以用作控製表達式的值是十分靈活的,除了標量類型(scalar types,如IntCharacter)外,你可以使用任何類型的值,包括浮點數、字符串、元組、自定義類的實例和可選(optional)類型,甚至是枚舉類型中的成員值和指定的範圍(range)等。關於在switch語句中使用這些類型,詳情參見控製流一章的 Switch

你可以在模式後麵添加一個起保護作用的表達式(guard expression)。起保護作用的表達式是這樣構成的:關鍵字where後麵跟著一個作為額外測試條件的表達式。因此,當且僅當控製表達式匹配一個case的某個模式且起保護作用的表達式為真時,對應 case 分支中的 statements 才會被執行。在下麵的例子中,控製表達式隻會匹配含兩個相等元素的元組,如(1, 1)

case let (x, y) where x == y:

正如上麵這個例子,也可以在模式中使用let(或var)語句來綁定常量(或變量)。這些常量(或變量)可以在其對應的起保護作用的表達式和其對應的case塊裡的代碼中引用。但是,如果 case 中有多個模式匹配控製表達式,那麼這些模式都不能綁定常量(或變量)。

switch語句也可以包含默認(default)分支,隻有其它 case 分支都無法匹配控製表達式時,默認分支中的代碼才會被執行。一個switch語句隻能有一個默認分支,而且必須在switch語句的最後麵。

儘管模式匹配操作實際的執行順序,特彆是模式的計算順序是不可知的,但是 Swift 規定switch語句中的模式匹配的順序和書寫源代碼的順序保持一致。因此,當多個模式含有相同的值且能夠匹配控製表達式時,程序隻會執行源代碼中第一個匹配的 case 分支中的代碼。

Switch 語句必須是完備的

在 Swift 中,switch語句中控製表達式的每一個可能的值都必須至少有一個 case 分支與之對應。在某些情況下(例如,表達式的類型是Int),你可以使用默認塊滿足該要求。

不存在隱式的貫穿(fall through)

當匹配的 case 分支中的代碼執行完畢後,程序會終止switch語句,而不會繼續執行下一個 case 分支。這就意味著,如果你想執行下一個 case 分支,需要顯式地在你需要的 case 分支裡使用fallthrough語句。關於fallthrough語句的更多信息,詳情參見 Fallthrough 語句


Switch語句語法
switch語句 → switch 表達式 { SwitchCase列表 可選 }
SwitchCase列表 → SwitchCase SwitchCase列表 可選
SwitchCase → case標簽 多條語句(Statements) | default標簽 多條語句(Statements)
SwitchCase → case標簽 ; | default標簽 ;
case標簽 → case case項列表 :
case項列表 → 模式 guard-clause 可選 | 模式 guard-clause 可選 , case項列表
default標簽 → default :
guard-clause → where guard-expression
guard-expression → 表達式