swift 简单语句 控制流语句
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在 Swift 中,有兩種類型的語句:簡單語句和控制流語句。簡單語句是最常見的,用于構(gòu)造表達(dá)式和聲明。控制流語句則用于控制程序執(zhí)行的流程,Swift 中有三種類型的控制流語句:循環(huán)語句、分支語句和控制傳遞語句。
?
循環(huán)語句用于重復(fù)執(zhí)行代碼塊;分支語句用于執(zhí)行滿足特定條件的代碼塊;控制傳遞語句則用于修改代碼的執(zhí)行順序。在稍后的敘述中,將會詳細(xì)地介紹每一種類型的控制流語句。
?
是否將分號(;)添加到語句的結(jié)尾處是可選的。但若要在同一行內(nèi)寫多條獨立語句,請務(wù)必使用分號。
?
GRAMMAR OF A STATEMENT
?
statement → expression; opt
?
statement → declaration; opt
?
statement → loop-statement; opt
?
statement → branch-statement; opt
?
statement → labeled-statement
?
statement → control-transfer-statement; opt
?
statement → statment statements; opt
?
循環(huán)語句
取決于特定的循環(huán)條件,循環(huán)語句允許重復(fù)執(zhí)行代碼塊。Swift 提供四種類型的循環(huán)語句:for語句、for-in語句、while語句和do-while語句。
?
通過break語句和continue語句可以改變循環(huán)語句的控制流。有關(guān)這兩條語句,詳情參見 Break 語句和 Continue 語句。
?
GRAMMAR OF A LOOP STATEMENT
?
loop-statement → for-statement
?
loop-statement → for-in-statement
?
loop-statement → while-statement
?
loop-statement → do-while-statement
?
For 語句
for語句允許在重復(fù)執(zhí)行代碼塊的同時,遞增一個計數(shù)器。
?
for語句的形式如下:
for?`initialzation`;?`condition`;?`increment`?{?????`statements`?}initialzation、condition 和 increment 之間的分號,以及包圍循環(huán)體 statements 的大括號都是不可省略的。
?
for語句的執(zhí)行流程如下:
?
1、initialzation 只會被執(zhí)行一次,通常用于聲明和初始化在接下來的循環(huán)中需要使用的變量。
2、計算 condition 表達(dá)式: 如果為true,statements 將會被執(zhí)行,然后轉(zhuǎn)到第3步。如果為false,statements 和 increment 都不會被執(zhí)行,for至此執(zhí)行完畢。
3、計算 increment 表達(dá)式,然后轉(zhuǎn)到第2步。
?
定義在 initialzation 中的變量僅在for語句的作用域以內(nèi)有效。condition 表達(dá)式的值的類型必須遵循LogicValue協(xié)議。
?
GRAMMAR OF A FOR STATEMENT
?
for-statement → for for-init opt ; expression opt ; expression opt code-block
?
for-statement → for ( for-init opt ; expression opt ; expression opt ) code-block
?
for-statement → variable-declaration | expression-list
?
For-In 語句
for-in語句允許在重復(fù)執(zhí)行代碼塊的同時,迭代集合(或遵循Sequence協(xié)議的任意類型)中的每一項。
?
for-in語句的形式如下:
for?`item`?in?`collection`?{?????`statements`?}for-in語句在循環(huán)開始前會調(diào)用 collection 表達(dá)式的generate方法來獲取一個生成器類型(這是一個遵循Generator協(xié)議的類型)的值。接下來循環(huán)開始,調(diào)用 collection 表達(dá)式的next方法。如果其返回值不是None,它將會被賦給 item,然后執(zhí)行 statements,執(zhí)行完畢后回到循環(huán)開始處;否則,將不會賦值給 item 也不會執(zhí)行 statements,for-in至此執(zhí)行完畢。
?
GRAMMAR OF A FOR-IN STATEMENT
?
for-in-statement → for pattern in expression code-block
?
While 語句
while語句允許重復(fù)執(zhí)行代碼塊。
?
while語句的形式如下:
while?`condition`?{?????`statements`?}while語句的執(zhí)行流程如下:
?
1、計算 condition 表達(dá)式: 如果為真true,轉(zhuǎn)到第2步。如果為false,while至此執(zhí)行完畢。
2、執(zhí)行 statements ,然后轉(zhuǎn)到第1步。
?
由于 condition 的值在 statements 執(zhí)行前就已計算出,因此while語句中的 statements 可能會被執(zhí)行若干次,也可能不會被執(zhí)行。
?
condition 表達(dá)式的值的類型必須遵循LogicValue協(xié)議。同時,condition 表達(dá)式也可以使用可選綁定,詳情參見可選綁定。
?
GRAMMAR OF A WHILE STATEMENT
?
while-statement → while while-condition code-block
?
while-condition → expression | declaration
?
Do-While 語句
do-while語句允許代碼塊被執(zhí)行一次或多次。
?
do-while語句的形式如下:
do?{?????`statements`?}?while?`condition`do-while語句的執(zhí)行流程如下:
?
1、執(zhí)行 statements,然后轉(zhuǎn)到第2步。
2、計算 condition 表達(dá)式: 如果為true,轉(zhuǎn)到第1步。如果為false,do-while至此執(zhí)行完畢。
?
由于 condition 表達(dá)式的值是在 statements 執(zhí)行后才計算出,因此do-while語句中的 statements 至少會被執(zhí)行一次。
?
condition 表達(dá)式的值的類型必須遵循LogicValue協(xié)議。同時,condition 表達(dá)式也可以使用可選綁定,詳情參見可選綁定。
?
GRAMMAR OF A DO-WHILE STATEMENT
?
do-while-statement → do code-block while while-condition
?
分支語句
取決于一個或者多個條件的值,分支語句允許程序執(zhí)行指定部分的代碼。顯然,分支語句中條件的值將會決定如何分支以及執(zhí)行哪一塊代碼。Swift 提供兩種類型的分支語句:if語句和switch語句。
?
switch語句中的控制流可以用break語句修改,詳情請見Break 語句。
?
GRAMMAR OF A BRANCH STATEMENT
?
branch-statement → if-statement
?
branch-statement → switch-statement
?
If 語句
取決于一個或多個條件的值,if語句將決定執(zhí)行哪一塊代碼。
?
if語句有兩種標(biāo)準(zhǔn)形式,在這兩種形式里都必須有大括號。
?
第一種形式是當(dāng)且僅當(dāng)條件為真時執(zhí)行代碼,像下面這樣:
if?`condition`?{?????`statements`?}第二種形式是在第一種形式的基礎(chǔ)上添加 else 語句,當(dāng)只有一個 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協(xié)議。同時,條件也可以使用可選綁定,詳情參見可選綁定。
?
GRAMMAR OF AN IF STATEMENT
?
if-statement → if if-condition code-block else-clause opt
?
if-condition → expression | declaration
?
else-clause → else code-block | else if-statement opt
?
Switch 語句
取決于switch語句的控制表達(dá)式(control expression),switch語句將決定執(zhí)行哪一塊代碼。
?
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語句的控制表達(dá)式(control expression)會首先被計算,然后與每一個 case 的模式(pattern)進(jìn)行匹配。如果匹配成功,程序?qū)?zhí)行對應(yīng)的 case 分支里的 statements。另外,每一個 case 分支都不能為空,也就是說在每一個 case 分支中至少有一條語句。如果你不想在匹配到的 case 分支中執(zhí)行代碼,只需在該分支里寫一條break語句即可。
?
可以用作控制表達(dá)式的值是十分靈活的,除了標(biāo)量類型(scalar types,如Int、Character)外,你可以使用任何類型的值,包括浮點數(shù)、字符串、元組、自定義類的實例和可選(optional)類型,甚至是枚舉類型中的成員值和指定的范圍(range)等。關(guān)于在switch語句中使用這些類型,詳情參見控制流一章的 Switch。
?
你可以在模式后面添加一個起保護(hù)作用的表達(dá)式(guard expression)。起保護(hù)作用的表達(dá)式是這樣構(gòu)成的:關(guān)鍵字where后面跟著一個作為額外測試條件的表達(dá)式。因此,當(dāng)且僅當(dāng)控制表達(dá)式匹配一個case的某個模式且起保護(hù)作用的表達(dá)式為真時,對應(yīng) case 分支中的 statements 才會被執(zhí)行。在下面的例子中,控制表達(dá)式只會匹配含兩個相等元素的元組,如(1, 1):
case?let?(x,?y)?where?x?==?y:正如上面這個例子,也可以在模式中使用let(或var)語句來綁定常量(或變量)。這些常量(或變量)可以在其對應(yīng)的起保護(hù)作用的表達(dá)式和其對應(yīng)的case塊里的代碼中引用。但是,如果 case 中有多個模式匹配控制表達(dá)式,那么這些模式都不能綁定常量(或變量)。
?
switch語句也可以包含默認(rèn)(default)分支,只有其它 case 分支都無法匹配控制表達(dá)式時,默認(rèn)分支中的代碼才會被執(zhí)行。一個switch語句只能有一個默認(rèn)分支,而且必須在switch語句的最后面。
?
盡管模式匹配操作實際的執(zhí)行順序,特別是模式的計算順序是不可知的,但是 Swift 規(guī)定switch語句中的模式匹配的順序和書寫源代碼的順序保持一致。因此,當(dāng)多個模式含有相同的值且能夠匹配控制表達(dá)式時,程序只會執(zhí)行源代碼中第一個匹配的 case 分支中的代碼。
?
Switch 語句必須是完備的
在 Swift 中,switch語句中控制表達(dá)式的每一個可能的值都必須至少有一個 case 分支與之對應(yīng)。在某些情況下(例如,表達(dá)式的類型是Int),你可以使用默認(rèn)塊滿足該要求。
?
不存在隱式的貫穿(fall through)
當(dāng)匹配的 case 分支中的代碼執(zhí)行完畢后,程序會終止switch語句,而不會繼續(xù)執(zhí)行下一個 case 分支。這就意味著,如果你想執(zhí)行下一個 case 分支,需要顯式地在你需要的 case 分支里使用fallthrough語句。關(guān)于fallthrough語句的更多信息,詳情參見 Fallthrough 語句。
?
GRAMMAR OF A SWITCH STATEMENT
?
switch-statement → switch expression { switch-cases opt }
?
switch-cases → switch-case switch-cases opt
?
switch-case → case-label statement | default-label statements
?
switch-case → case-label ; | default-label ;
?
case-label → case case-item-list :
?
case-item-list → pattern guard-clause opt | pattern guard-clause opt, case-item-list
?
default-label → default :
?
guard-clause → where guard-expression
?
guard-expression → expression
?
帶標(biāo)簽的語句
你可以在循環(huán)語句或switch語句前面加上標(biāo)簽,它由標(biāo)簽名和緊隨其后的冒號(:)組成。在break和continue后面跟上標(biāo)簽名可以顯式地在循環(huán)語句或switch語句中更改控制流,把控制權(quán)傳遞給指定標(biāo)簽標(biāo)記的語句。關(guān)于這兩條語句用法,詳情參見 Break 語句和 Continue 語句。
?
標(biāo)簽的作用域是該標(biāo)簽所標(biāo)記的語句之后的所有語句。你可以不使用帶標(biāo)簽的語句,但只要使用它,標(biāo)簽名就必唯一。
?
關(guān)于使用帶標(biāo)簽的語句的例子,詳情參見控制流一章的帶標(biāo)簽的語句。
?
GRAMMAR OF A LABELED STATEMENT
?
labeled-statement → statement-label loop-statement | statement-label switch-statement
?
statement-label → label-name :
?
label-name → identifier
?
控制傳遞語句
通過無條件地把控制權(quán)從一片代碼傳遞到另一片代碼,控制傳遞語句能夠改變代碼執(zhí)行的順序。Swift 提供四種類型的控制傳遞語句:break語句、continue語句、fallthrough語句和return語句。
?
GRAMMAR OF A CONTROL TRANSER STATEMENT
?
control-transfer-statement → break-statement
?
control-transfer-statement → continue-statement
?
control-transfer-statement → fallthrough-statement
?
control-transfer-statement → return-statement
?
Break 語句
break語句用于終止循環(huán)或switch語句的執(zhí)行。使用break語句時,可以只寫break這個關(guān)鍵詞,也可以在break后面跟上標(biāo)簽名(label name),像下面這樣:
break?break?`label?name`當(dāng)break語句后面帶標(biāo)簽名時,可用于終止由這個標(biāo)簽標(biāo)記的循環(huán)或switch語句的執(zhí)行。
?
而當(dāng)只寫break時,則會終止switch語句或上下文中包含break語句的最內(nèi)層循環(huán)的執(zhí)行。
?
在這兩種情況下,控制權(quán)都會被傳遞給循環(huán)或switch語句外面的第一行語句。
?
關(guān)于使用break語句的例子,詳情參見控制流一章的 Break 和帶標(biāo)簽的語句。
?
GRAMMAR OF A BREAK STATEMENT
?
break-statement → break label-name opt
?
Continue 語句
continue語句用于終止循環(huán)中當(dāng)前迭代的執(zhí)行,但不會終止該循環(huán)的執(zhí)行。使用continue語句時,可以只寫continue這個關(guān)鍵詞,也可以在continue后面跟上標(biāo)簽名(label name),像下面這樣:
continue?continue?`label?name`當(dāng)continue語句后面帶標(biāo)簽名時,可用于終止由這個標(biāo)簽標(biāo)記的循環(huán)中當(dāng)前迭代的執(zhí)行。
?
而當(dāng)只寫break時,可用于終止上下文中包含continue語句的最內(nèi)層循環(huán)中當(dāng)前迭代的執(zhí)行。
?
在這兩種情況下,控制權(quán)都會被傳遞給循環(huán)外面的第一行語句。
?
在for語句中,continue語句執(zhí)行后,increment 表達(dá)式還是會被計算,這是因為每次循環(huán)體執(zhí)行完畢后 increment 表達(dá)式都會被計算。
?
關(guān)于使用continue語句的例子,詳情參見控制流一章的 Continue 和帶標(biāo)簽的語句。
?
GRAMMAR OF A CONTINUE STATEMENT
?
continue-statement → continue label-name opt
?
Fallthrough 語句
fallthrough語句用于在switch語句中傳遞控制權(quán)。fallthrough語句會把控制權(quán)從switch語句中的一個 case 傳遞給下一個 case 。這種傳遞是無條件的,即使下一個 case 的模式與switch語句的控制表達(dá)式的值不匹配。
?
fallthrough語句可出現(xiàn)在switch語句中的任意 case 里,但不能出現(xiàn)在最后一個 case 分支中。同時,fallthrough語句也不能把控制權(quán)傳遞給使用了可選綁定的 case 分支。
?
關(guān)于在switch語句中使用fallthrough語句的例子,詳情參見控制流一章的控制傳遞語句。
?
GRAMMAR OF A FALLTHROUGH STATEMENT
?
continue-statement → fallthrough
?
Return 語句
return語句用于在函數(shù)或方法的實現(xiàn)中將控制權(quán)傳遞給調(diào)用者,接著程序?qū)恼{(diào)用者的位置繼續(xù)向下執(zhí)行。
?
使用return語句時,可以只寫return這個關(guān)鍵詞,也可以在return后面跟上表達(dá)式,像下面這樣:
return?return?`expression`當(dāng)return語句后面帶表達(dá)式時,表達(dá)式的值將會返回給調(diào)用者。如果表達(dá)式值的類型與調(diào)用者期望的類型不匹配,Swift 則會在返回表達(dá)式的值之前將表達(dá)式值的類型轉(zhuǎn)換為調(diào)用者期望的類型。
?
而當(dāng)只寫return時,僅僅是將控制權(quán)從該函數(shù)或方法傳遞給調(diào)用者,而不返回一個值。(這就是說,該函數(shù)或方法的返回類型為Void或())
?
GRAMMAR OF A RETURN STATEMENT
?
return-statement → return expression opt
轉(zhuǎn)載于:https://my.oschina.net/sunqichao/blog/279660
總結(jié)
以上是生活随笔為你收集整理的swift 简单语句 控制流语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐升级版PDF在线转Word转换器
- 下一篇: 跨域请求之JSONP