《DAY 29》天气 App 实作(二)

昨天已经把 struct 写好了,今天来呈现资料在手机画面上,在此之前可以先上网搜寻 API 说明文件,方便自己刻 UI。

  • elementName 所代表的意义如下。
    Wx. 天气现象. MaxT. 最高温度. MinT. 最低温度. CI. 舒适度. PoP. 降雨机率.

  • 帮 Label 连接好 IBOutlet。
    https://ithelp.ithome.com.tw/upload/images/20201012/20129680pXLLQDRbwm.png

  • 改写先前的程序,让 Label 呈现出资料。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var locationName: UILabel!
    @IBOutlet weak var Wx: UILabel!
    @IBOutlet weak var PoP: UILabel!
    @IBOutlet weak var MinT: UILabel!
    @IBOutlet weak var CI: UILabel!
    @IBOutlet weak var MaxT: UILabel!
    @IBOutlet weak var startTime: UILabel!
    @IBOutlet weak var endTime: UILabel!
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var request = URLRequest(url: URL(string: "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-6F803E34-66E5-4135-AC7D-25811AD53D5C&format=JSON&locationName=%E5%AE%9C%E8%98%AD%E7%B8%A3")!,timeoutInterval: Double.infinity)
        request.httpMethod = "GET"
        let task = URLSession.shared.dataTask(with: request){(data, respond, 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.Wx.text = weather.records.location[0].weatherElement[0].time[0].parameter.parameterName
                    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.CI.text = weather.records.location[0].weatherElement[3].time[0].parameter.parameterName
                    self.MaxT.text = weather.records.location[0].weatherElement[4].time[0].parameter.parameterName + "°" + weather.records.location[0].weatherElement[4].time[0].parameter.parameterUnit!
                    self.startTime.text = weather.records.location[0].weatherElement[0].time[0].startTime
                    self.endTime.text = weather.records.location[0].weatherElement[0].time[0].endTime

                }
                
            }
            else {
                print("error")
            }

        }
        task.resume()
        
    }
    
}

执行看看。
https://ithelp.ithome.com.tw/upload/images/20201012/20129680cxwqKpCCQR.png

  • JSON 里的 startTime ~ endTime 其实有提供三个区间,目前我只呈现了第一个区间的资料,之後会加入选取器让使用者选取。
  • 地点目前只有宜兰县,之後也会放入选取器让使用者选择地点。
  • 气象图示目前还不能变化,明天会一并完成。

<<:  DAY27 学习30天的c++

>>:  【少女人妻的30天Elastic】Day 27 : App Search_API 介绍与应用_Search Settings

拟定 ISMS 程序书撰写方向

确认导入范围 旨在确认企业或机构的决心,与实际要推广的范围。 订定资安目标 资安目标可以参考同业或客...

企划实现(14)

GOOGLE登入 第八步:宣告 GoogleSignInClient mgoogleSignInCl...

【把玩Azure DevOps】Day17 CI/CD从这里:Pipeline设定Schedule,每日晚上排程执行

现在有不少的软件会有一个特殊的版本叫Nightly,从字面上的意思就可以得知是指每个晚上发行的版本,...

[Day29] 倒数第二天~集大成!Next.js + React + Bootstrap + Reactstrap 十八般武艺(?)样样来,勇敢的上吧!

前言 因为今天已经来到倒数第二天! 觉得应该要把之前介绍过的东西全部融合在一起展现出来, 也算是成果...

Rust-结构体(Struct)

struct 是命名并封装数个栏位数值所组合的自订型别 struct 有 3 种类型 元组结构体(t...