Nic Lin's Blog

喜歡在地上滾的工程師

WatchOS 接 API 實作比特幣幣價顯示 (How to fetch JSON from URL)

這篇實作主要是練習如何使用 Swift 去實現

  1. Get JSON from URL
  2. Parse JSON

因為我平常有 Ruby 開發相關區塊鏈接 API 的經驗,所以這邊我挑了 CoinMarketCap 來串接,主要是因為他有直接兌換美元的結果,不需要再去計算,像是其他交易所如 Poloniex 只有 BTC 對 USDT ,畢竟 USDT 並不是真正的美元匯率(只是錨定接近而已)

一開始的 Outlet 跟簡單的 Interaction 就不多說了,就是拉一下 UI 畫面,分別設定好 Label 怎麼顯示、Button 會觸發什麼事件。

在這邊我意外發現一個專門講解 Swift 開發技巧的 Youtube 頻道,講的內容都很新,就以我現在 2017/12/02 來看,可以在影片看到上傳日期是 2017/07/01 ,講解的是最新 Swift 4 如何利用 Decodable 去 Parse JSON

Parsing JSON Just Became Super Easy in Swift 4 with Decodable

直接上程式碼

先宣告一個 Decodable 的 struct, 自訂你需要的型別

struct CryptoCurrency: Decodable {
    let name: String
    let price_usd: String
}
...

解析後並設定 label text 的 function

    func updateBitcoinPrice() {
        self.cryptoCurrencyLabel.setText("Fetching...")
        
        // Coinmarketcap
        guard let url = URL(string: "https://api.coinmarketcap.com/v1/ticker/?limit=10") else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            
            do {
                let crypto_currency = try JSONDecoder().decode([CryptoCurrency].self, from: data)
                
                let btc_price = crypto_currency.first?.price_usd ?? "0.00"
                
                self.cryptoCurrencyLabel.setText("\(btc_price) USD")
                
            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
            }
        }.resume()

這邊我比較懶的部分是直接拉 Array 的第一筆資料去顯示比特幣價格,因為 CoinMarketPrice 的價格顯示是依照交易量排名,也因此我認為比特幣交易量應該都是在第一名,所以在部份比較偷雞XD,不過還要在學習改進的部分是如何針對一長串的 Array 去找到指定符合的數值(今天只學拿到 data 然後解析完輸出)。

小結

不過稍微研究了一下 Swift 4 新的 Decodable + JSONDecoder 用法除了可以達到更簡單的語法撰寫,同時也能夠支援自訂型別,在以往的解決辦法常常要寫很冗長的程式碼或是使用第三方套件到了 Swift 4 都可以通通丟掉了。

實際作品在我的 Github watchOS-BitcoinPrice

參考資料

comments powered by Disqus