Swift分支語句
分支語句
取決於一個或者多個條件的值,分支語句允許程序執行指定部分的代碼。顯然,分支語句中條件的值將會決定如何分支以及執行哪一塊代碼。Swift 提供兩種類型的分支語句:if
語句和switch
語句。
switch
語句中的控製流可以用break
語句修改,詳情請見Break 語句。
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
語句,從而形成一條鏈來測試更多的條件,像下麵這樣:
ifcondition 1
{
statements to execute if condition 1 is true
} else ifcondition 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
語句的形式如下:
switchcontrol expression
{
casepattern 1
:
statements
casepattern 2
wherecondition
:
statements
casepattern 3
wherecondition
,
pattern 4
wherecondition
:
statements
default:
statements
}
switch
語句的控製表達式(control expression)會首先被計算,然後與每一個 case 的模式(pattern)進行匹配。如果匹配成功,程序將會執行對應的 case 分支裡的 statements。另外,每一個 case 分支都不能為空,也就是說在每一個 case 分支中至少有一條語句。如果你不想在匹配到的 case 分支中執行代碼,隻需在該分支裡寫一條break
語句即可。
可以用作控製表達式的值是十分靈活的,除了標量類型(scalar types,如Int
、Character
)外,你可以使用任何類型的值,包括浮點數、字符串、元組、自定義類的實例和可選(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 → 表達式