json - Swift3:Openweather API 返回 nil 和 API 错误

标签 json swift swift3 openweathermap

我正在尝试运行一个允许您使用搜索栏的应用程序,它只会返回温度、城市和条件。当我运行它时,我得到了一个零返回的温度和一个“代码:401 API 无效”错误。但是,我尝试过的两种代码都应该有效。我可能正在尝试从 OpenWeather 中获取错误的数据,但我似乎无法找出修复它的位置或方法 - 没有出现其他错误。

我正在尝试合并关于该主题的两个教程/指南,但一个使用不同的 API,另一个在 Swift2 中。

谢谢!

import UIKit

class ViewController: UIViewController, UISearchBarDelegate {


    @IBOutlet weak var citySearchBar: UISearchBar!
    @IBOutlet weak var cityLabel: UILabel!
    @IBOutlet weak var conditionLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!

    var temp: Int!
    var condition: String!
    var city: String!
    let apiID:String = "d7817e07565a0019c5e7851a59eeca73"

    var exists: Bool = true
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        citySearchBar.delegate = self
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        let urlRequest = URLRequest(url: URL(string: "http://api.openweathermap.org/data/2.5/weather?q=\(citySearchBar.text!.replacingOccurrences(of: " ", with: "_"))&appid=\(apiID))")!)

        let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

            if error == nil {
                do {

                    let weatherData = try JSONSerialization.jsonObject(
                        with: data!,
                        options: .mutableContainers) as! [String : AnyObject]

                    let weather = weatherData

                    DispatchQueue.main.async {

                        self.cityLabel.text = self.city
                        self.tempLabel.text = "\((self.temp))°"
                        self.conditionLabel.text = weather.description
                        }

                } catch let jsonError {
                    print(jsonError.localizedDescription)
                }  }  }

        task.resume()
    }  }

最佳答案

首先 temp 的值是 Double 而不是 Int

var temp = 0.0

其次,您没有在代码中设置 temptemp 的值在 weatherData

的字典 main
if let main = weatherData["main"] as? [String:Any],
   let tempValue = main["temp"] as? Double {
       self.temp = tempValue
       print(tempValue)
}

关于json - Swift3:Openweather API 返回 nil 和 API 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973357/

相关文章:

swift - Ios swift相机图像选择器旋转问题

swift - WatchOS InterfaceMap 更新用户在 map 上的位置

java - Jersey/Tomcat - 产生媒体冲突

json - 从字符串中删除无效的 UTF-8 字符

ios - Swift - 解析某些数据

swift 3 : UISearchBar in Popover ViewController shows up wider than expected (on iPad)

ios - 如何让 NSBatchDeleteRequest 删除并允许您再次添加回对象

java - 如何根据 Key 对 JSON 对象进行排序?

ios - 检测 UICollectionView 上的所有触摸

ios - 如何用字符串绘制 2 个带 x 轴的折线图