Результат обращения к updateWeatherIcon (условие :)) не используется и, следовательно, не будет отображать UIImage - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю небольшое приложение Weather, которое обращается к openweathermap API.Я использую JSONDecoder для анализа JSON из API.По большей части я могу получить большую часть данных в simulator.За исключением UIImage, который должен появиться на экране.Изображение в image.xcassets.Ниже приведена структура.

import UIKit
import CoreLocation

struct WeatherData: Codable {
let coord: Coord
let weather: [Weather]
let base: String
let main: Main
let visibility: Int
let wind: Wind
let clouds: Clouds
let dt: Int
let sys: Sys
let id: Int
let name: String
let cod: Int
 }

struct Clouds: Codable {
let all: Int
}

struct Coord: Codable {
let lon, lat: Double
}

struct Main: Codable {
let temp: Double
let pressure, humidity: Int
let tempMin, tempMax: Double

//    enum CodingKeys: String, CodingKey {
 //        case temp, pressure, humidity
 //        case tempMin = "temp_min"
 / /        case tempMax = "temp_max"
 //    }
 }

struct Sys: Codable {
let type, id: Int
let message: Double
let country: String
let sunrise, sunset: Int
}

struct Weather: Codable {
let id: Int
let main, description, icon: String
}

struct Wind: Codable {
let speed: Double
let deg: Int
}

Ниже приведен код доступа к JSON:

private func getWeatherData(parameters: [String : String]) {
    guard let lat = parameters["lat"],
        let long = parameters["long"],
        let appID = parameters["appid"] else { print("Invalid parameters"); return }
    var urlComponents = URLComponents(string: "https://api.openweathermap.org/data/2.5/weather")!
    let queryItems = [URLQueryItem(name: "lat", value: lat),
                      URLQueryItem(name: "lon", value: long),
                      URLQueryItem(name: "appid", value: appID)]
    urlComponents.queryItems = queryItems

    guard let url = urlComponents.url else { return }
    URLSession.shared.dataTask(with: url) { ( data, response, err ) in
        DispatchQueue.main.async { // never, never, never sync !!
            if let err = err {
                print("Failed to get data from url:", err)
                return
            }
            guard let data = data else { return }
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let city = try decoder.decode(WeatherData.self, from: data)
                print(city)
                //self.updateWeatherData(city)
               self.weatherData.description = city.weather[0].main
                self.weatherData.temperature = Int(city.main.temp - 273)
                self.weatherData.city = city.name
                self.weatherData.condition = city.weather[0].id
                 WeatherDataModel().updateWeatherIcon(condition: self.weatherData.condition)
                self.updateUIWeatherData()

            } catch {
                print(error)
                self.cityLabel.text = "Connection issues"
            }
        }
        }.resume()
}

и функция, которая отображает данные на симуляторе:

func updateUIWeatherData() {
    cityLabel.text = weatherData.city
    temperatureLabel.text = String(weatherData.temperature)
    decriptionLabel.text = String(weatherData.description)
    weatherIcon.image = UIImage(named: weatherData.weatherIconName)
}

Я посмотрел на другой пример этого waring и не совсем уверен, что это значит в отношении этого приложения. Пример результата вызова не используется .Любая помощь будет оценена.

1 Ответ

1 голос
/ 29 апреля 2019

Мне кажется, что вам нужна строка

self.weatherData.weatherIconName = WeatherDataModel().updateWeatherIcon(condition: self.weatherData.condition)

вместо

WeatherDataModel().updateWeatherIcon(condition: self.weatherData.condition)

В предупреждении говорится, что вы вычисляете weatherIcon, но оно не назначаетсяк чему-либо (ваша weatherData переменная)

...