【从零开始的Swift开发心路历程-Day23】天气预报App实作Part2

昨天我们已经能成功将JSON格式的资料print出来了,接着就来实作天气预报App吧!
首先,我们要先将JSON格式的资料写成Codable的Struct,这部分要细心一点不能出错!
我们要先新增一个.swift档

如这张图所示,JSON格式是层层包住的

那你.swift档里面的struct就必须这样写

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
}

以此类推....
完成之後呢,我们上中央气象局的API说明文件来查看有什麽预报因子是我们所需要在App上显示出来的

分别是Wx天气现象,ManT最高温度,MinT最低温度,CI舒适度,PoP降雨机率,再将这些预报因子用UILabel来显示
然後要写一个function来解析JSON资料

func loadAPI(locationName: String ,time: Int){
        let url =  "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-FCD3F473-1F08-455C-9FF0-11AE228B011E&format=JSON&locationName=\(locationName)&time=\(time)"
        let newUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        var request = URLRequest(url: URL(string: newUrl)!,timeoutInterval: Double.infinity)
        request.httpMethod = "GET"
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            let decoder = JSONDecoder()
            if let data = data, let weather = try? decoder.decode(Weather.self, from: data){
                print(weather)
                DispatchQueue.main.sync {
                    self.locationName.text = weather.records.location[0].locationName
                    self.maxT.text = weather.records.location[0].weatherElement[4].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[4].time[time].parameter.parameterUnit!
                    self.minT.text = weather.records.location[0].weatherElement[2].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[2].time[time].parameter.parameterUnit!
                    self.cI.text = weather.records.location[0].weatherElement[3].time[time].parameter.parameterName
                    self.poP.text = weather.records.location[0].weatherElement[1].time[time].parameter.parameterName + "%"
                    self.startTime.text = weather.records.location[0].weatherElement[0].time[time].startTime
                    self.endTime.text = weather.records.location[0].weatherElement[0].time[time].endTime
                    self.wx.text = weather.records.location[0].weatherElement[0].time[time].parameter.parameterName
                }
            }
            else {
                print("error")
            }
        }
        task.resume()
    }

之後按执行

就能成功在App上显示天气资讯啦!
但现在只能显示台中市的天气资讯
明天我们就来利用UIButton来选择想要的地点及时间


<<:  Day 20 K-近邻演算法(KNN)

>>:  [Day23]-用python处理影像档案2

热门AI平台分享 | Dataiku 让跨专业的数据协作成为可能

大数据落地的三部曲是:意愿、能力、工具 当今很多企业其实并不缺乏用数据辅助决策的意愿 缺的反而是「营...

Day 22:Spinner 下拉选单结合县市乡镇小工具

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...

铁人赛 Day8 -- 一定要知道的 CSS (五) - align & 如何使 ''Div'' 区块 置中对齐

前言 align 主要是以交错轴为主,而昨天的 ustify-content 则是以主轴为主 ali...

[Day30] Cloud Meow Meow

喵喵喵喵喵喵喵喵!!!终於写完 30 天的文章了,这 30 天中,我们从云端的概念开始,进入了 Go...

活到老,学到老,Ruby 30 天刷题修行篇第三话

哈罗,我是 A Fei,今天是铁人赛开赛第三天,大家连假有去哪里走走吗?在这边叮咛大家,还是要多注意...