前面第3課曾經提過,「函式」的目的是要作為一般化工具,也就是將特定問題的解,推廣為一般化的解。

例如在範例1-5c寫的「費氏數列()」函式,可用在1-6a整數分解的程式裡面,費氏數列() 就變成一般化工具,所以我們在程式裡面複製了一份「費氏數列()」程式碼與其所需的全域變數「數列」「最大索引」。

不過這樣一來,有兩個問題,一是函式用得越多,程式碼就需要複製越多,二是如果以後這個函式「費氏數列()」有更好的解法,就需要修改所有引用這個函式的地方。這樣對於程式設計的長久發展很不利,要如何改善呢?

改善的方法簡單的說,就是「模組化」,Swift Playgrounds 提供了簡單(對初學者足夠用)的模組化功能。

做法就是將要一般化的函式,放入到 Swift Playgrounds 左側欄下面的「原始碼」->「UserModule」裡面,這樣就能讓所有頁面的程式共用。

但是將「費氏數列()」程式碼剪貼到 SharedCode.swift 裡面之後,原來的程式會出現錯誤:

這是因為它們已經不在同一個頁面,所以在有效範圍內會找不到「費氏數列()」名稱,解決的方法就是將共用的「費氏數列()」宣告為 "public":

這樣在所有頁面就可看到「費氏數列()」,共用這個函式,減少程式碼的複製,而且還有一個好處,以後如果修改「費氏數列()」(例如有更好的解法),也只要在這一個地方修改就行。

除此之外,如果需要用別人寫的程式模組,也可以這樣使用,在 UserModule 旁邊按 ⨁「新增」程式碼,就可以放更多程式碼進來,讓所有頁面分享共用。

操作過程影片如下:

https://youtu.be/G3kUu_4fv-Y