类型“ MyWeather”不符合协议“可编码”错误

时间:2018-08-08 14:01:11

标签: ios swift xcode api

我正在尝试制作一个使用OpenWeatherMap API来检查当前天气的iOS应用,但是我收到一个错误消息,提示“类型'MyWeather'不符合协议'Encodable'。我是Swift编程的新手,这可能是一个简单的错误。感谢您的帮助。

我的下面的代码:

struct MyWeather: Codable {

    let name: String?
    let location: String?
    let temp: URL?
    let wind: Int?

    //THE NAMES OF THE JSON STUFF IN THE LINK


    private enum CodingKeys: String, CodingKey {

        case weather
        case name
        case location
        case temp
        case wind

        //THE NAMES OF THE JSON STUFF IN THE LINK

    }


     }

class ViewController: UIViewController {

    @IBAction func ShowWeatherInfo(_ sender: Any) {

        guard let APIUrl = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=Crowland&appid=APIKEY&units=Metric") else { return }

        URLSession.shared.dataTask(with: APIUrl) { (data, response
            , error) in

            guard let data = data else { return }
            do {

                let decoder = JSONDecoder()
                let weatherData = try decoder.decode(MyWeather.self, from: data)

1 个答案:

答案 0 :(得分:0)

您需要删除此

case weather

因为没有变量,所以仅当您更改键名时,才使用CodingKeys,官方json的Codable为

struct MyWeather: Codable {
    let cod: String
    let message: Double
    let cnt: Int
    let list: [List]
    let city: City
}

struct City: Codable {
    let id: Int
    let name: String
    let coord: Coord
    let country: String
}

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

struct List: Codable {
    let dt: Int
    let main: MainClass
    let weather: [Weather]
    let clouds: Clouds
    let wind: Wind
    let sys: Sys
    let dtTxt: String
    let rain, snow: Rain?

    enum CodingKeys: String, CodingKey {
        case dt, main, weather, clouds, wind, sys
        case dtTxt = "dt_txt"
        case rain, snow
    }
}

struct Clouds: Codable {
    let all: Int
}

struct MainClass: Codable {
    let temp, tempMin, tempMax, pressure: Double
    let seaLevel, grndLevel: Double
    let humidity: Int
    let tempKf: Double

    enum CodingKeys: String, CodingKey {
        case temp
        case tempMin = "temp_min"
        case tempMax = "temp_max"
        case pressure
        case seaLevel = "sea_level"
        case grndLevel = "grnd_level"
        case humidity
        case tempKf = "temp_kf"
    }
}

struct Rain: Codable {
    let the3H: Double?

    enum CodingKeys: String, CodingKey {
        case the3H = "3h"
    }
}

struct Sys: Codable {
    let pod: Pod
}

enum Pod: String, Codable {
    case d = "d"
    case n = "n"
}

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

enum Description: String, Codable {
    case brokenClouds = "broken clouds"
    case clearSky = "clear sky"
    case fewClouds = "few clouds"
    case lightRain = "light rain"
    case moderateRain = "moderate rain"
}

enum MainEnum: String, Codable {
    case clear = "Clear"
    case clouds = "Clouds"
    case rain = "Rain"
}

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