循環式控制流
熟悉了me
物件的功能後,我們將用目前它的前進
和右轉
功能,來執行一些任務,想像一下讓它進行這樣的移動:
// (0,0) // ➙(0,4) 前進四步 // ➙(1,4) 右轉,並且前進一步 // ➙(1,0) 右轉,並且前進四步 // ➙(2,0) 左轉,並且前進一步
你或許會寫出這樣子的程式碼:
我.前進() 我.前進() 我.前進() 我.前進() // 前進四步,到達 (0,4) 我.右轉() // 轉向東方 (x軸正向) 我.前進() // 到達 (1,4) 我.右轉() // 轉向南方 (y軸負向) 我.前進() 我.前進() 我.前進() 我.前進() // 前進四步,到達 (1,0) 我.右轉() 我.右轉() 我.右轉() // 右轉三次等於左轉,面向東方 (x軸正向) 我.前進() // 到達 (2,0)
執行起來是沒有問題的!你將會看到系統不斷印出我
的行動,最後成功到達了我們期待的座標(2,0)
。但是僅僅是如此簡單的命令就消耗了我們 15 行的程式碼,如果今天我
要前進 100 步,難道真的得寫 100 行我.前進()
才行嗎?
這當然是不可能的!電腦最擅長的事情之一,就是接收簡單的指令,並且不斷執行同樣的動作,這也是本章的重點,我們將介紹幾種不同的「迴圈」寫法,迴圈的直觀意義就是「在某個條件下,不斷地執行這個圈圈裡的指令。」
for a in 1...10 { print(a) } // 試試看執行結果,猜測一下這段程式碼的功能?
for-in
迴圈是基礎的迴圈之一,這段程式碼的意義是:讓電腦知道有個整數資料a
,並且開始執行{
和}
包裹的程式碼,對於每個在1
到10
中間的整數,迴圈都會完整執行完一次,執行時a
的值分別等於1
、2
、3
...10
。如果我們不需要a
的值,也可以用底線代替,如下:
for _ in 1...10 { print("Hello!") } // 這段程式碼會印出 10 次 Hello!
現在,請執行一個任務,讓我們開始時使用的me
物件,順時針繞著一個邊長是 5 的正方形走一圈。
for _ in 1...5 { 我.前進() } 我.右轉() for _ in 1...5 { 我.前進() } 我.右轉() for _ in 1...5 { 我.前進() } 我.右轉() for _ in 1...5 { 我.前進() } 我.右轉()
非常正確的程式碼,執行起來也沒有問題,我
以走五步為單位繞行了一週後,回到了原點(0,0)
,構成一個正方形。但正如我們將「走五步」這個「重複的動作」封裝在for-in
迴圈之中一樣,或許你會注意到:除了前進這個動作重複了五次以外,「走五步後右轉」這個動作也重複了四次,我們應該也可以將它封裝在for-in
迴圈之中才對!
for b in 1...4 { for a in 1...5 { 我.前進() } 我.右轉() }
電腦在進行這樣的指令的時候,首先試圖拆開最裡面的{
和}
包裹的程式碼(即是使用a
的迴圈),了解到前進這個動作是要進行五次的;隨後才拆開較外面的{
和}
包裹的程式碼(即是使用b
的迴圈),了解到「前進五次後右轉」這個動作要進行四次,之後正確的執行了包含 20 個前進和 4 個右轉這 24 條指令,卻只需要 6 行就寫完了!這樣的技巧稱做「巢狀迴圈」。
試著自己組合一下目前為止學過的技巧,印出一個九九乘法表!