DAY 20 『 连接 API 实作 - 天气 APP 』Part2

昨天介绍了如何抓取 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 18 - [语料库模型] 06-程序码: TF、IDF、TF-IDF

>>:  从零开始的8-bit迷宫探险【Level 24】谁才是高玩?纪录本机最高得分

[Day 28] LIFF Bluetooth 与 LINE Things

前言 所以说LIFF Bluetooth能用在哪里? 最近我买了一台智能电风扇,当觉得热,又觉得伫立...

Day 9— 物品借用纪录系统 (1) 基础建构

今天我们要来制作新的专题:物品借用纪录微服务! 在学校,尤其是行政处室,最常出现的状况应该就是「借物...

ISO 27001 资讯安全管理系统 【解析】(七)

(五)员工 我们目前拥有多名员工,分别是管理阶层、软件开发、硬体维护、营业部门、客户管理及财务和管理...

Day2 让我们开始吧

工欲善其事,必先利其器,好的开始是成功的一半~ 今天来把要使用的环境建立好 这次我选用的是线上编辑器...

企划实现(13)

GOOGLE登入 第一步:在firebase添加一个新的专案 第二步:选取android专案 第三步...