第1單元第8課曾提過「逐步改善」的觀念,軟體最大的優勢就是彈性,能夠逐步擴充App的內容、持續改善用戶體驗與服務流程,以因應新的需求。

持續改善的過程,其實也是持續學習的過程,沒有人第一次寫App就一炮而紅,總是從觀摩或模仿別人的App開始,甚至要從使用者回饋的問題中學習,最後才能寫出自己獨特的App。

在本單元最後一課,我們就來試試如何擴充並改善前一課所寫的App。

初步的想法,是利用 Swift Playgrounds 4.0 本身的新功能:一個App可以包含多個Swift程式,分散在多個檔案裡。本課再寫一個「台灣生物多樣性」的程式,然後將「特有種鳥類」與「生物多樣性」透過 SwiftUI 的 TabView 整合在一個App裡面,如下圖:

image.png

其次,在第1單元第8課也介紹過「物件導向」的程式設計方法,不過本單元到目前為止,大多將函式(func)與資料類型(struct)分開,觀念上屬於函式化程式設計(functional programming),兩個方法都能有效解決問題,但背後設計理念不同,物件導向更適合解決複雜問題,在本課我們就改用物件導向方法來試試看有何差異。

這次我們選用的內容是「政府開放資料平台(Open Data)」 -- 農委會特生中心(特有生物研究保育中心)的「台灣生物多樣性網絡(TBN)」,這裏搜集了台灣2萬多種動植物的物種分類與1千多萬筆百年來的觀測紀錄,堪稱是台灣目前最完整的生態資料庫,最棒的是提供Open API開放給大眾使用。

根據「台灣生物多樣性網絡」Open API說明文件,資料結構分為兩層,第一層有3個欄位:meta, links 與 data,第二層才是個別資料,我們需要的都在 data 裡面。對應的資料類型宣告如下:

struct 物種列表: Codable {
    var meta: 總數
    var links: 頁次
    var data: [物種資料]
}
struct 總數: Codable {
    var total: Int
}
struct 頁次: Codable {
    var next: String
}
struct 物種資料: Codable, Hashable {
    var taxonUUID: String         //分類編號
    var taxonName: String         //分類名稱(中英文)
    var simplifiedScientificName: String    //學名(拉丁文)
    var vernacularName: String    //本地名稱(中文)
    var taxonRank: String         //分類階層(中文)
    var family: String            //科名(中英文)
}

有了資料結構,就可以用「傑森解碼器」來取得資料,需要連結的網址格式範例為:

// 舊版
// <https://www.tbn.org.tw/api/v2/species?name=佛甲草&limit=30>
// 新版 v2.5
<https://www.tbn.org.tw/api/v25/taxon?name=佛甲草&limit=30>

基本上就是將「name=佛甲草」參數改為其他搜尋字串即可。

我們先仿照上一課範例3-9a寫一個文字模式程式,來驗證資料結構與傑森解碼器是否正確,但改用「物件導向」的方法,完整程式如下: