語句
本頁包含內容:
在 Swift 中,有兩種型別的語句:簡單語句和控制流程語句。簡單語句是最常見的,用於建構表達式和宣告。控制流程語句則用於控制程式執行的流程,Swift 中有三種型別的控制流程語句:迴圈語句、分支語句和控制傳遞語句。
迴圈語句用於重複執行程式碼區塊;分支語句用於執行滿足特定條件的程式碼區塊;控制傳遞語句則用於修改程式碼的執行順序。在稍後的敘述中,將會詳細地介紹每一種型別的控制流程語句。
是否將分號(;
)添加到語句的結尾處是可選的。但若要在同一行內寫多條獨立語句,請務必使用分號。
語句語法
語句 → 表達式 ; 可選
語句 → 宣告 ; 可選
語句 → 迴圈語句 ; 可選
語句 → 分支語句 ; 可選
語句 → 標記語句(Labeled Statement)
語句 → 控制轉移語句 ; 可選
多條語句(Statements) → 語句 多條語句(Statements) 可選
迴圈語句
取決於特定的迴圈條件,迴圈語句允許重複執行程式碼區塊。Swift 提供四種型別的迴圈語句:for
語句、for-in
語句、while
語句和do-while
語句。
通過break
語句和continue
語句可以改變迴圈語句的控制流程。有關這兩條語句,詳情參見 Break 語句和 Continue 語句。
迴圈語句語法
迴圈語句 → for語句
迴圈語句 → for-in語句
迴圈語句 → while語句
迴圈語句 → do-while語句
For 語句
for
語句允許在重複執行程式碼區塊的同時,遞增一個計數器。
for
語句的形式如下:
for
initialzation
;condition
;increment
{
statements
}
initialzation、condition 和 increment 之間的分號,以及包圍迴圈 statements 的大括號都是不可省略的。
for
語句的執行流程如下:
- initialzation 只會被執行一次,通常用於宣告和初始化在接下來的迴圈中需要使用的變數。
- 計算 condition 表達式:
如果為
true
,statements 將會被執行,然後轉到第3步。如果為false
,statements 和 increment 都不會被執行,for
至此執行完畢。 - 計算 increment 表達式,然後轉到第2步。
定義在 initialzation 中的變數僅在for
語句的作用域以內有效。condition 表達式的值的型別必須遵循LogicValue
協定。
For 迴圈語法
for語句 → for for初始條件 可選 ; 表達式 可選 ; 表達式 可選 程式碼區塊
for語句 → for ( for初始條件 可選 ; 表達式 可選 ; 表達式 可選 ) 程式碼區塊
for初始條件 → 變數宣告 | 表達式列表
For-In 語句
for-in
語句允許在重複執行程式碼區塊的同時,迭代集合(或遵循Sequence
協定的任意型別)中的每一項。
for-in
語句的形式如下:
for
item
incollection
{
statements
}
for-in
語句在迴圈開始前會呼叫 collection 表達式的generate
方法來獲取一個生成器型別(這是一個遵循Generator
協定的型別)的值。接下來迴圈開始,呼叫 collection 表達式的next
方法。如果其回傳值不是None
,它將會被賦給 item,然後執行 statements,執行完畢後回到迴圈開始處;否則,將不會賦值給 item 也不會執行 statements,for-in
至此執行完畢。
While 語句
while
語句允許重複執行程式碼區塊。
while
語句的形式如下:
while
condition
{
statements
}
while
語句的執行流程如下:
- 計算 condition 表達式:
如果為真
true
,轉到第2步。如果為false
,while
至此執行完畢。 - 執行 statements ,然後轉到第1步。
由於 condition 的值在 statements 執行前就已計算出,因此while
語句中的 statements 可能會被執行若干次,也可能不會被執行。
condition 表達式的值的型別必須遵循LogicValue
協定。同時,condition 表達式也可以使用可選綁定,詳情參見可選綁定。
Do-While 語句
do-while
語句允許程式碼區塊被執行一次或多次。
do-while
語句的形式如下:
do {
statements
} whilecondition
do-while
語句的執行流程如下:
- 執行 statements,然後轉到第2步。
- 計算 condition 表達式:
如果為
true
,轉到第1步。如果為false
,do-while
至此執行完畢。
由於 condition 表達式的值是在 statements 執行後才計算出,因此do-while
語句中的 statements 至少會被執行一次。
condition 表達式的值的型別必須遵循LogicValue
協定。同時,condition 表達式也可以使用可選綁定,詳情參見可選綁定。
分支語句
取決於一個或者多個條件的值,分支語句允許程式執行指定部分的程式碼。顯然,分支語句中條件的值將會決定如何分支以及執行哪一塊程式碼。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
語句,從而形成一條鏈來測試更多的條件,像下面這樣:
if
condition 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
語句的形式如下:
switch
control 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 → 表達式
</a> 帶標簽的語句
你可以在迴圈語句或switch
語句前面加上標簽,它由標簽名和緊隨其後的冒號(:)組成。在break
和continue
後面跟上標簽名可以顯式地在迴圈語句或switch
語句中更改控制流程,把控制權傳遞給指定標簽標記的語句。關於這兩條語句用法,詳情參見 Break 語句和 Continue 語句。
標簽的作用域是該標簽所標記的語句之後的所有語句。你可以不使用帶標簽的語句,但只要使用它,標簽名就必唯一。
關於使用帶標簽的語句的範例,詳情參見控制流程一章的帶標簽的語句。
標記語句語法
標記語句(Labeled Statement) → 語句標簽 迴圈語句 | 語句標簽 switch語句
語句標簽 → 標簽名稱 :
標簽名稱 → 識別符號
控制傳遞語句
通過無條件地把控制權從一片程式碼傳遞到另一片程式碼,控制傳遞語句能夠改變程式碼執行的順序。Swift 提供四種型別的控制傳遞語句:break
語句、continue
語句、fallthrough
語句和return
語句。
控制傳遞語句(Control Transfer Statement) 語法
控制傳遞語句 → break語句
控制傳遞語句 → continue語句
控制傳遞語句 → fallthrough語句
控制傳遞語句 → return語句
Break 語句
break
語句用於終止迴圈或switch
語句的執行。使用break
語句時,可以只寫break
這個關鍵詞,也可以在break
後面跟上標簽名(label name),像下面這樣:
break
breaklabel name
當break
語句後面帶標簽名時,可用於終止由這個標簽標記的迴圈或switch
語句的執行。
而當只寫break
時,則會終止switch
語句或上下文中包含break
語句的最內層迴圈的執行。
在這兩種情況下,控制權都會被傳遞給迴圈或switch
語句外面的第一行語句。
關於使用break
語句的範例,詳情參見控制流程一章的 Break 和帶標簽的語句。
Break 語句語法
break語句 → break 標簽名稱 可選
Continue 語句
continue
語句用於終止迴圈中當前迭代的執行,但不會終止該迴圈的執行。使用continue
語句時,可以只寫continue
這個關鍵詞,也可以在continue
後面跟上標簽名(label name),像下面這樣:
continue
continuelabel name
當continue
語句後面帶標簽名時,可用於終止由這個標簽標記的迴圈中當前迭代的執行。
而當只寫break
時,可用於終止上下文中包含continue
語句的最內層迴圈中當前迭代的執行。
在這兩種情況下,控制權都會被傳遞給迴圈外面的第一行語句。
在for
語句中,continue
語句執行後,increment 表達式還是會被計算,這是因為每次迴圈執行完畢後 increment 表達式都會被計算。
關於使用continue
語句的範例,詳情參見控制流程一章的 Continue 和帶標簽的語句。
Continue 語句語法
continue語句 → continue 標簽名稱 可選
Fallthrough 語句
fallthrough
語句用於在switch
語句中傳遞控制權。fallthrough
語句會把控制權從switch
語句中的一個 case 傳遞給下一個 case 。這種傳遞是無條件的,即使下一個 case 的模式與switch
語句的控制表達式的值不匹配。
fallthrough
語句可出現在switch
語句中的任意 case 裡,但不能出現在最後一個 case 分支中。同時,fallthrough
語句也不能把控制權傳遞給使用了可選綁定的 case 分支。
關於在switch
語句中使用fallthrough
語句的範例,詳情參見控制流程一章的控制傳遞語句。
Fallthrough 語句語法
fallthrough語句 → fallthrough
Return 語句
return
語句用於在函式或方法的實作中將控制權傳遞給呼叫者,接著程式將會從呼叫者的位置繼續向下執行。
使用return
語句時,可以只寫return
這個關鍵詞,也可以在return
後面跟上表達式,像下面這樣:
return
returnexpression
當return
語句後面帶表達式時,表達式的值將會回傳給呼叫者。如果表達式值的型別與呼叫者期望的型別不匹配,Swift 則會在回傳表達式的值之前將表達式值的型別轉換為呼叫者期望的型別。
而當只寫return
時,僅僅是將控制權從該函式或方法傳遞給呼叫者,而不回傳一個值。(這就是說,該函式或方法的回傳型別為Void
或()
)
Return 語句語法
return語句 → return 表達式 可選