自訂指令
在進行上一節最後的幾個小練習的時候,想必有很多狀況需要讓我
進行左轉的動作對吧!大家雖然學會了使用for-in
迴圈,以連續右轉
三次的方式完成左轉,但for-in
迴圈雖然方便,總歸是三行程式碼,要是有一行指令可以讓我直接左轉,豈不是省事多了!
就像自訂型態一樣,當我們覺得電腦給予的指令太少,而有特殊的需求想新增指令的時候,也是辦的到的!
func 說嗨() { print("hi") } 說嗨()
我們先使用func
指令告訴電腦,我們想要新增一個指令,並且將這個指令執行的程式碼放在{
和}
包裹的區域,此後電腦就認得我們剛剛命名的新指令了!我們在之後執行這個指令,電腦就會去查找並執行{
和}
包裹的程式碼。
func 叫我左轉() { for _ in 1...3 { 我.右轉() } }
撰寫了這樣的指令之後,我們就可以用叫我左轉()
來代替三行的for-in
迴圈程式碼,當整個程式有很多時機需要左轉時,這個設計可以省下大量的程式碼,而且讓我們的程式更容易閱讀。
接著聰明的你很興奮的幫我
增加了各種功能...
func 叫我前進兩步() { for _ in 1...2 { 我.前進() } } func 叫我前進三步() { for _ in 1...3 { 我.前進() } } func 叫我前進四步() { for _ in 1...4 { 我.前進() } } ...
等等,這實在是有點蠢對吧?就不能有個功能讓我
使用一個變數來設定要前進幾步嗎?
var 步數:Int = 0 func 叫我前進幾步() { for _ in 1...步數 { 我.前進() } } 步數 = 5 叫我前進幾步()
非常聰明的設計!如果你自己想到了這樣的方式,恭喜你,擁有這種舉一反三的能力,學習程式設計絕對是如虎添翼的。然而,你或許想到了我們的程式目前有幾個非常明顯的缺陷?考慮這樣的程式碼:
var 我 = me(面向: 方向.北方, 座標:原點) var 我的分身 = me(面向: 方向.北方, 座標:原點)
我
和我的分身
是兩個不同的me
物件,他們的屬性互不相干,也可以分開行動,但是問題來了,叫我左轉()
和叫我前進幾步()
都是對我
的操作(如果你想要叫我的分身
左轉,在迴圈裡面應該是執行我的分身.右轉()
三次才對。)難道我們要幫我的分身
也寫幾乎一模一樣的func
?那步數
要讓我
和我的分身
共用嗎?程式越變越複雜之後會不會有問題?
大家可以好好思考這些設計有可能造成那些問題,在下一週的課程,我們會介紹新的設計方式來解決它們。