iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
Mobile Development

ios 的小小實驗室 !系列 第 20

DAY 20 『 連接 API 實作 - 天氣 APP 』Part2

  • 分享至 

  • xImage
  •  

昨天介紹了如何抓取 API,今天來介紹如何根據 JSON 寫一個 struct。


為了接收 API Response 的資訊,可以根據 JSON 寫一個 struct,用事先宣告好的變數,去撈取資訊。
在專案底下 New Group / New File / 選 Cocoa Touch Class

在 Weather.swift 檔案裡依照JSON格式來寫結構

import UIKit
//依照JSON格式來寫結構
struct Weather: Codable {
    var records: records
}

struct records: Codable {
    var location: [location]
}

struct location: Codable {
    var locationName: String
    var weatherElement: [weatherElement]
}

struct weatherElement: Codable {
    var elementName: String
    var time: [time]
}

struct time: Codable {
    var startTime: String
    var endTime: String
    var parameter: parameter
}

struct parameter: Codable {
    var parameterName: String
    //parameterValue 和 parameterUnit 不一定存在
    var parameterValue: String?
    var parameterUnit: String?
}

在 ViewController.swift 加入程式碼,執行看看,確認寫的結構沒有問題。

import UIKit
import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif
class MainVC: UIViewController {
    var authorization = "CW*******授權碼********92" // 會員授權碼
    override func viewDidLoad() {
        super.viewDidLoad()
        getWeatherData() // 進入畫面前先讀一次 JSON
    }
// MARK: - 透過JSON抓取OpenWeatherMap的天氣資訊
    func getWeatherData() {
        let oldurl =  "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=\(authorization)&format=JSON&locationName=%E5%AE%9C%E8%98%AD%E7%B8%A3"
        let newUrl = oldurl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! // 網址有中文,需要先編碼
        var request = URLRequest(url: URL(string: newUrl)!,timeoutInterval: Double.infinity)
        request.httpMethod = "GET"
        let task = URLSession.shared.dataTask(with: request) { [self] data, response, error in
            let decoder = JSONDecoder()
            if let data = data, let weather = try? decoder.decode(Weather.self, from: data){
                print(weather)
                // 顯示在主畫面Lable上的資訊
                DispatchQueue.main.sync {
                    // 顯示地名
                    self.locationName.text = weather.records.location[0].locationName
                    // 降雨機率
                    self.pop.text = weather.records.location[0].weatherElement[1].time[0].parameter.parameterName + "%"
                    // 最低溫度
                    self.minT.text = weather.records.location[0].weatherElement[2].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[2].time[0].parameter.parameterUnit!
                    // 最高溫度
                    self.maxT.text = weather.records.location[0].weatherElement[4].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[4].time[0].parameter.parameterUnit!
                    // 舒適度
                    self.wx.text = weather.records.location[0].weatherElement[0].time[0].parameter.parameterName
                    // 背景依據舒適度而改變
                    self.descriptionToImage()
                }
            }
            else {print("error")}
        }
        task.resume()
    }  
}

明天會介紹如何呈現資料在手機畫面上

敬請期待!


上一篇
DAY 19 『 連接 API 實作 - 天氣 APP 』Part1
下一篇
DAY 21 『 連接 API 實作 - 天氣 APP 』Part3
系列文
ios 的小小實驗室 !30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言