Получите ошибку в URL-адресе при попытке получить данные из API

#ios #json #swift #openweathermap #urlsession

Вопрос:

Я пытаюсь получить данные от openweathermap.org и получите ошибку в url

Ошибка: Поток 1: Фатальная ошибка: Неожиданно найдено ноль при развертывании необязательного значения

Это мои данные:

 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=Londonamp;appid=myAppID"  getData(from: url)  }  func getData(from url: String) {    let task = URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in //**lt;--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()    } }  

Комментарии:

1. Внимательно посмотрите на строку URL-адреса. После этого следует (недопустимый) пробел :// . И вы должны использовать https:// схему И никогда не печатать localizedDescription в блоке ошибок декодирования. Распечатайте только error экземпляр. Он содержит полную ошибку декодирования.

2. Кроме того, никогда не публикуйте свой API — ключ на форуме. Я отредактировал его, но я бы сгенерировал новый ключ.

Ответ №1:

Здесь есть 2 проблемы. Сначала в строке URL-адреса есть пробел между косыми чертами и доменом http:// api . Это неверный URL-адрес

Во-вторых, вы принудительно разворачиваете объект URL здесь: URL(string: url)! . Это не проблема, исходящая от API, это проблема с кодом на вашей стороне. Принудительное разворачивание чрезвычайно опасно, и его следует избегать любой ценой. Вы не можете поймать эти ошибки. Сначала вам нужно проверить наличие проблем и, при необходимости, развернуть URL-адрес. Например:

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