#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) .....