【问题标题】:Get an error in url, when trying to get data from API尝试从 API 获取数据时,在 url 中出现错误
【发布时间】:2022-01-02 22:51:52
【问题描述】:

我正在尝试从 openweathermap.org 获取数据并在 url

中遇到错误

错误:线程 1:致命错误:在展开可选值时意外发现 nil

这是我的数据:

struct CitiesWeather: Decodable {
    
    var coord : Coordinate?
    
}

struct Coordinate: Decodable {
    
    var longitude: Double
    var latitude: Double
    
}

我的代码:

class DayWeatherViewModel: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    let url = "http:// api.openweathermap.org/data/2.5/weather?q=London&appid=myAppID"
    getData(from: url)

}

func getData(from url: String) {
        
        let task = URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in //**<--Error in url!**
            guard let data = data, error == nil else {
                print("something went wrong")
                return
            }
            
            var result: CitiesWeather?
            do {
                result = try JSONDecoder().decode(CitiesWeather.self, from: data)
            }
            catch {
                print("failed to convert \(error.localizedDescription)")
            }
            
            guard let json = result else {
                return
            }
            print(json.coord)
            print(json.coord?.latitude)
            print(json.coord?.longitude)
        }
        
        task.resume()
        
    }
}

【问题讨论】:

  • 仔细查看 URL 字符串。 :// 后面有一个(无效的)空格字符。你应该使用https:// 方案并且永远不要在解码错误块中打印localizedDescription。仅打印 error 实例。它包含综合解码错误。
  • 另外,切勿在论坛上发布您的 API 密钥。我编辑了它,但我会生成一个新密钥。

标签: ios json swift openweathermap urlsession


【解决方案1】:

这里有两个问题。首先,您的 URL 字符串在斜杠和域 http:// api 之间有一个空格。这不是一个有效的网址

其次,您在此处强制解包 URL 对象:URL(string: url)!。这不是来自 API 的问题,这是您这边的代码问题。强制展开是非常危险的,应该不惜一切代价避免。你无法捕捉到这些错误。您需要先检查问题,然后可以选择打开 URL。例如:

guard let url = URL(string: "...") else {
    print("Failed to parse URL")
    return
}

URLSession.shared.dataTask(with: url) .....

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2021-09-18
    • 1970-01-01
    • 2022-11-07
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2019-09-03
    相关资源
    最近更新 更多