开发步骤4:创建最小天气应用

在这一步中,我将基于从APIXU API提取的JSON数据制作一个最小的天气应用程序。 我已经在步骤3中详细说明了API和JSON数据:https://medium.com/@darrendao/development-step-3-import-data-from-other-sources-to-swift-9ce5edff3033


1.参考

我遵循以下教程:

  • https://www.youtube.com/watch?v=YLAsBxGpcMQ
  • https://www.youtube.com/watch?v=doqtsIsbtqs

为了创建这个应用程序并尝试做几次以了解其功能。

2.结果

但是,问题是,当涉及到带有两个(或两个以上)单词的城市时,Xcode无法理解,因为它是一个URL链接。 然后我了解到,为了在URL中包含空格,总是将其替换为%20 。 因此, searchBar.text!.replacingOccurrences(of: “ “, with: “%20" —如果单词中有空格,则将其替换为“%20"

接下来,我添加了let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in以从Apixu中获取我需要的数据,这是城市名称,温度,天气状况及其相应图标。

通过查看json数据的工作方式以及我之前提到的方便的json格式扩展名,我可以转到示例Apixu json文件并获取所需的类以输入到我的代码中,如下所示。

 让json =试试JSONSerialization.jsonObject(with:data !, options:.mutableContainers)as!  [String:AnyObject]如果让current = json [“ current”]设为?  [String:AnyObject] {如果让temp = current [“ temp_c”]为? 如果让condition = current [“ condition”]为int,则为{self.degree = temp}。  [String:AnyObject] {self.condition = condition [“ text”]为! 字符串图标= condition [“ icon”]为!  Stringself.imgURL =“ http:\(icon)”}}是否让location = json [“ location”]为?  [String:AnyObject] {self.city = location [“ name”]为! 串} 

我为需要的每个数据分配了新标签,而不是分配给之前创建的UI标签-因为来自apixu的json数据无法理解我自己的UI标签。 然后,我以后将新标签连接到UI标签。 这是我在代码开头添加的新标签:

  var程度:Int!var条件:字符串!var imgURL:字符串!var city:字符串! 

还有一件事,如果用户进入一个不存在的城市,将会发生什么? 我必须添加一个错误警告,即使用与Apixu相同的交互方式,找不到匹配的城市。

var exists: Bool = true

 如果let _ = json [“ error”] {self.exists = false} DispatchQueue.main.async {如果self.exists {self.degreeLbl.isHidden = falseself.conditionLbl.isHidden = falseself.imgView.isHidden = falseself.degreeLbl。 text =“ \(self.degree.description)°” self.cityLbl.text = self.cityself.conditionLbl.text = self.conditionself.imgView.downloadImage(from:self.imgURL!)} else {self.degreeLbl.isHidden = trueself.conditionLbl.isHidden = trueself.imgView.isHidden = trueself.cityLbl.text =“未找到匹配的城市” self.exists = true 

但是,Apixu的状态图标仍未显示在我的模拟器中。 我发现我还没有添加UIImageView扩展来加载图像。 此扩展之后的功能与我之前的代码相同…

 扩展UIImageView {func downloadImage(from url:String){let urlRequest = URLRequest(url:URL(string:url)!)let task = URLSession.shared.dataTask(with:urlRequest){(data,response,error)inif error ==无{DispatchQueue.main.async {self.image = UIImage(data:data!)}}} task.resume()}} 

4.我学到了什么

从Apixu加载图像:在编写代码时,图标无法从Apixu加载到我的模拟器。 一段时间后,我发现图像的json格式是这样的: “icon”: “//cdn.apixu.com/weather/64x64/night/122.png” 。 它应该是基于url的! 那是我添加的这一行

self.imgURL = “http:\(icon)”

应用程序传输安全设置:我需要“允许任意加载”,才能从Apixu加载URL查找。 转到您的应用程序文件夹中的Into.plist以添加设置。

5.结论…

了解JSON之后,我现在非常有信心地说它并不像我一直想的那样可怕。 实际上,我发现它非常方便和友好(当然,当您知道如何解析它时)。 我想研究更多有关其他API的信息,因为目前,大公司都向开发人员开放其数据以使用它们。 凭借我尝试做的基础知识,我绝对可以超越一个气象应用程序。

5.完整代码