在Swift裡面,則有三種的迴圈,如下所述:
這種寫法的迴圈,我都會給它一個我自己的命名,叫「後綴迴圈」,因為它的條件是寫在後面,而先給前面的動作執行重複內容。所以要我來描述的話,大概會長這樣:
重複打印number這個動作、number也會在這個迴圈內不停的加2,直到number到9這個限制為止,整個迴圈結束。
所以就理解上,這個程式就是把條件往後放了,讓它在執行的時候條件在後面執行。
不過,迴圈這件事情,雖然作為決定流程的一種方式,它還有很多延伸出來的功能,如能跳離迴圈的break、繼續執行迴圈內容的continue、多重迴圈(exiting mutiple loop)、無限循環迴圈(infinite loop)等。
迴圈中有一個很重要的概念,就是控制轉移語句,它可以決定整個流程要如何的進行,而迴圈中最常見的就是continue、break兩者:
continue we’re saying “I’m done with the current(當前的) run of this loop” – Swift will skip the rest of the loop body, and go to the next item in the loop.
But when we say break we’re saying “I’m done with this loop altogether, so get out completely.”
只要在continue的指令下,就會馬上的跳過這個循環圈,也就會變成上面這樣,只要是3的倍數,就會被跳過,所以打印出來的就都是3的倍數以外的數字了。
到10就沒有了。
這兩種用法、概念其實在程式語言中很常見,尤其是用在迴圈上。
“as soon as the combination is found, exit all the loops at once”
假若你今天遇到一種情況,這種情況是會需要很多迴圈一起進行的時候:
你會需要這個「Outerloop」這個標籤,它代表了整個迴圈,而不是只有第一行的那個而已。
在上述的程式碼中,我們試圖要找到一種符合[“Sam”,”Austin”,”MJ”]三個名字的組合,所以第一個、第二個、第三個迴圈分別都執行,並放在attempt這個常數裡面,假如attempt跟combination相等,那就打印出符合combination的組合,一旦找到了,就直接跳出整個迴圈。
所以假若沒有使用Outerloop這個迴圈的話,我們可能要多放兩次的break,多麻煩啊!一個Outerloop滿足三個願望!
當你的迴圈並沒有明確的設定停損點的時候,就會產生這種瘋狂執行的情況….這個叫做無限循環迴圈,所以通常看要不是條件設多一點,可以跳出迴圈,再不然就是用個break或continue來調整一下整個迴圈的設置。
控制轉移語句除了上面描述的continue、break之外,還有fallthrough,但fallthrough比較特別,它只能用在Switch case的使用中,大致上意義如下:
fallthrough的主要意義,我想引用Swift起步走的說法就是:
Swift 的switch中,只要比對到一個case即會執行其內的程式,並結束這整個switch的動作,如果在特殊情況下需要執行緊接著的下一個case內的程式,就要用到fallthrough。
也就是說:一般的Switch case,會在匹配到符合條件的設置後,就跳出程式進行的結果,
而,加上fallthrough後,就會變成緊接著下一個case的內容也要執行,如下:
既然都提到控制轉移語句了,不得不提到Return,它算是一種最常見的控制轉移語句,那它作為一種控制轉移語句,實質上的意思是什麼呢?
return語句用於在函數或方法的實現中將控制權傳遞給調用者,接着程序將會從調用者的位置繼續向下執行。
使用return語句時,可以只寫return這個關鍵詞,也可以在return後面跟上表達式,像下面這樣:
return
return expression
換句話說,就是return語句可以回傳值,也可以不回傳東西,但回傳一種程式執行完成的控制權:
當只寫return時,僅僅是將控制權從該函數或方法傳遞給調用者,而不返回一個值。(這就是說,該函數或方法的返回類型爲Void或())
所以,return出現的時候,通常是要回傳一個值、一個字串….諸如此類的,也有可能是代表程式這區塊執行完畢,將控制權交還給編譯人員。
綜合上述,其實控制轉移語句都是一種具有強制性的執行機構,它可以直接的跳過當前的執行項目(continue)、跳離整個程式(break)、無縫接軌的繼續下一個case(Switch case的fallthrough)、返回值或控制權(return)。
這四個項目是目前Swift中,會使用的控制轉移語句。
鐵人賽