【问题标题】:Type 'MyWeather' does not conform to protocol 'Encodable' error类型“MyWeather”不符合协议“Encodable”错误
【发布时间】:2018-08-08 22:35:40
【问题描述】:

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

我的代码如下:

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)

【问题讨论】:

    标签: ios swift xcode api


    【解决方案1】:

    你需要删除这个

    case weather
    

    因为它没有 var 也使用 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
    }
    

    【讨论】:

    • 请问您是如何从 API 链接创建这些结构的?有没有可以生成这些结构的网站或程序?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多