翻譯:coverxit 校對:numbbbbb, coverxit, stanzhai

語句


本頁包含內容:

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

initialzationconditionincrement 之間的分號,以及包圍迴圈 statements 的大括號都是不可省略的。

for語句的執行流程如下:

  1. initialzation 只會被執行一次,通常用於宣告和初始化在接下來的迴圈中需要使用的變數。
  2. 計算 condition 表達式: 如果為truestatements 將會被執行,然後轉到第3步。如果為falsestatementsincrement 都不會被執行,for至此執行完畢。
  3. 計算 increment 表達式,然後轉到第2步。

定義在 initialzation 中的變數僅在for語句的作用域以內有效。condition 表達式的值的型別必須遵循LogicValue協定。

For 迴圈語法
for語句for for初始條件 可選 ; 表達式 可選 ; 表達式 可選 程式碼區塊
for語句for ( for初始條件 可選 ; 表達式 可選 ; 表達式 可選 ) 程式碼區塊
for初始條件變數宣告 | 表達式列表

For-In 語句

for-in語句允許在重複執行程式碼區塊的同時,迭代集合(或遵循Sequence協定的任意型別)中的每一項。

for-in語句的形式如下:

for item in collection {
statements
}

for-in語句在迴圈開始前會呼叫 collection 表達式的generate方法來獲取一個生成器型別(這是一個遵循Generator協定的型別)的值。接下來迴圈開始,呼叫 collection 表達式的next方法。如果其回傳值不是None,它將會被賦給 item,然後執行 statements,執行完畢後回到迴圈開始處;否則,將不會賦值給 item 也不會執行 statementsfor-in至此執行完畢。

For-In 迴圈語法
for-in語句for 模式 in 表達式 程式碼區塊

While 語句

while語句允許重複執行程式碼區塊。

while語句的形式如下:

while condition {
statements
}

while語句的執行流程如下:

  1. 計算 condition 表達式: 如果為真true,轉到第2步。如果為falsewhile至此執行完畢。
  2. 執行 statements ,然後轉到第1步。

由於 condition 的值在 statements 執行前就已計算出,因此while語句中的 statements 可能會被執行若干次,也可能不會被執行。

condition 表達式的值的型別必須遵循LogicValue協定。同時,condition 表達式也可以使用可選綁定,詳情參見可選綁定

While 迴圈語法
while語句while while條件 程式碼區塊
while條件表達式 | 宣告

Do-While 語句

do-while語句允許程式碼區塊被執行一次或多次。

do-while語句的形式如下:

do {
statements
} while condition

do-while語句的執行流程如下:

  1. 執行 statements,然後轉到第2步。
  2. 計算 condition 表達式: 如果為true,轉到第1步。如果為falsedo-while至此執行完畢。

由於 condition 表達式的值是在 statements 執行後才計算出,因此do-while語句中的 statements 至少會被執行一次。

condition 表達式的值的型別必須遵循LogicValue協定。同時,condition 表達式也可以使用可選綁定,詳情參見可選綁定

Do-While 迴圈語法
do-while語句do 程式碼區塊 while while條件

分支語句

取決於一個或者多個條件的值,分支語句允許程式執行指定部分的程式碼。顯然,分支語句中條件的值將會決定如何分支以及執行哪一塊程式碼。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列表 可選
SwitchCasecase標簽 多條語句(Statements) | default標簽 多條語句(Statements)
SwitchCasecase標簽 ; | default標簽 ;
case標簽case case項列表 :
case項列表模式 guard-clause 可選 | 模式 guard-clause 可選 , case項列表
default標簽default :
guard-clausewhere guard-expression
guard-expression表達式

</a> 帶標簽的語句

你可以在迴圈語句或switch語句前面加上標簽,它由標簽名和緊隨其後的冒號(:)組成。在breakcontinue後面跟上標簽名可以顯式地在迴圈語句或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
break label name

break語句後面帶標簽名時,可用於終止由這個標簽標記的迴圈或switch語句的執行。

而當只寫break時,則會終止switch語句或上下文中包含break語句的最內層迴圈的執行。

在這兩種情況下,控制權都會被傳遞給迴圈或switch語句外面的第一行語句。

關於使用break語句的範例,詳情參見控制流程一章的 Break帶標簽的語句

Break 語句語法
break語句break 標簽名稱 可選

Continue 語句

continue語句用於終止迴圈中當前迭代的執行,但不會終止該迴圈的執行。使用continue語句時,可以只寫continue這個關鍵詞,也可以在continue後面跟上標簽名(label name),像下面這樣:

continue
continue label 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
return expression

return語句後面帶表達式時,表達式的值將會回傳給呼叫者。如果表達式值的型別與呼叫者期望的型別不匹配,Swift 則會在回傳表達式的值之前將表達式值的型別轉換為呼叫者期望的型別。

而當只寫return時,僅僅是將控制權從該函式或方法傳遞給呼叫者,而不回傳一個值。(這就是說,該函式或方法的回傳型別為Void()

Return 語句語法
return語句return 表達式 可選