在第1單元,我們發現「陣列與 for迴圈」真是程式語言中的最佳拍檔,能夠聯手處理大量複雜資料,而且只要驗證過一兩筆,同樣的程式碼就可以處理無數筆同樣類型的資料,非常符合老子「道生一,一生二,二生三,三生萬物」的哲學。

到第2單元,同樣的概念可以延伸到「陣列與ForEach」,如同前一課範例2-6b所展示的,這組拍檔可以產生無數個視圖,只要資料源源不絕的進來。

呃,問題就在資料如何源源不絕的進來?我們總不能將資料都寫在程式裡面吧!類似抖音、Instagram、Netflix以及很多一頁式網站,畫面格式是固定的,但內容可以不斷地更新,永遠都看不完,是怎麼做到的?

這就得靠「傑森」來幫忙。「傑森(JSON)」原來是 Javascript 程式語言用在動態網頁的一種資料傳輸格式,由網路後端伺服器將資料庫的結構化資料,轉換成 JSON格式,傳到使用者的瀏覽器上面,瀏覽器上面的Javascript程式再將JSON格式解構,依照欄位與設計架構呈現在畫面上,如下圖所示。利用這樣的方式,可以源源不絕地產生動態的畫面內容。

image.png

實際上的JSON格式與程式碼非常接近,用程式來轉換非常方便,而且也很容易讓人閱讀或手動編輯,如下圖。因為簡單又方便,因此成為目前網路資料交換格式的業界標準,透過 JSON格式,程式就等於有一隻手延伸到雲端資料庫上面,資料自然可以源源不絕供應進來。

image.png

更棒的是,有越來越多的網站,開放其程式介面(Open API),也是使用JSON格式來交換資料,例如 Google map, Apple Music, Facebook 等等,國內的政府資料開放平台(Open Data)也部分提供JSON格式,因此,學會在程式中使用JSON格式,未來結合網路程式,就能延伸到各大網站,享受無窮盡的資料寶藏。

筆者已將30種台灣特有種鳥類的資料,轉換成JSON格式,分享在網路上:

https://drive.google.com/drive/folders/1UT3BNDAfb24lzpPJxZ0ysVzNmNP-yQ4h

請下載 "2-7 台灣特有種鳥類 - 2021.json" 到自己設備或放在 iCloud雲端,方便匯入到 Swift Playgrounds 裡面,匯入的方式跟圖片類似,但是要選「所有類型」,如下:

image.png

確認檔案匯入之後,就可以執行以下的範例程式,執行結果會輸出到主控台(如上圖右側)。

// 2-7a 傑森解碼器
// Created by Heman, 2021/08/18
import Foundation

struct 鳥類: Codable, Identifiable {
    var id: Int
    var 中文名: String
    var 別名: String
    var 科名: String
    var 英文名: String
    var 圖片檔名: String
    var 圖片來源: String
    var 攝影者: String
}

func 傑森解碼器(_ 檔名: String) -> [鳥類]? {
    if let 檔案 = Bundle.main.url(forResource: 檔名, withExtension: "json") {
        do {
            let 資料 = try Data(contentsOf: 檔案)
            let 結果 = try JSONDecoder().decode([鳥類].self, from: 資料)
            return 結果
        } catch {
            print("error:\\(error)")
        }
    }
    return nil
}

let 特有種清單 = 傑森解碼器("2-7 台灣特有種鳥類 - 2021") ?? []

for 鳥種 in 特有種清單 {
    print(鳥種.id, 鳥種.中文名, "\\t", 鳥種.英文名, "\\t", 鳥種.圖片來源)
}

這個範例程式不需要圖形介面,因此只要 import Foundation 即可,我們要從 Foundation 物件庫中取出的物件稱為 JSONDecoder (傑森解碼器),這個物件的用法如下: