簡體   English   中英

類型“”不符合協議“可編碼”

[英]Type ' ' does not conform to protocol 'Encodable'

有人可以告訴這里有什么問題嗎?

它向我發送此錯誤:類型“CityWeatherInfo”不符合協議“Encodable”


struct CityWeatherInfo: Codable {
   var name: String
   var main: Main
   var weathers: [Weather]

   private enum CodingKeys: String, CodingKey {
       case weathers = "weather"
       case main = "main"
       case name

   }
   init(from decoder: Decoder) throws {
       let container = try decoder.container(keyedBy: CodingKeys.self)
       self.name = try container.decode(String.self, forKey: .name)
       let mainContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .main)
       let weatherContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .weathers)
   }
}

struct Weather: Decodable {
   var main: String
   var description: String

   private enum WeatherKeys: String, CodingKey {
       case main = "main"
       case description = "description"
   }
}

struct Main: Decodable {
   var temp: Double
   var feels_like: Double
   var temp_min: Double
   var temp_max: Double

   private enum MainKeys: String, CodingKey {
       case temp = "temp"
       case feels_like = "feels_like"
       case temp_min = "temp_min"
       case temo_max = "temp_max"
   }
}

Json 是這樣的:

{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":804,"main":"Clouds","description":"陰雲"," icon":"04n"}],"base":"stations","main":{"temp":287.45,"feels_like":286.61,"temp_min":284.82,"temp_max":289.15,"pressure": 1012,"濕度":72},"能見度":10000,"風":{"速度":1,"度":0},"雲":{"全部":100},"dt":1592362322 ,"sys":{"type":1,"id":1414,"country":"GB","sunrise":1592365362,"sunset":1592425222},"timezone":3600,"id":2643743 ,"名稱":"倫敦","鱈魚":200}

如果結構或 class 采用Codable ,則默認情況下會合成所需的方法init(from decoder: Decoder)encode(to encoder: Encoder)

但是,如果您自己實現其中一種方法,那么您也必須實現另一種方法。 或者——在這種情況下——只采用Decodable因為你只是在讀取/解碼數據。

您的代碼中有一些不好的做法。

  • 自定義 CodingKeys WeatherKeysMainKeys沒有意義,因為在默認語法中,框架會生成名為CodingKeys的鍵。 自定義鍵僅在自定義實現中被考慮。

  • 兩個nestedContainers都不需要,如果它們由相同的 CodingKeys 鍵控,它們無論如何都沒有意義。

  • 如果字典鍵與結構成員名稱匹配,則可以省略 CodingKeys。

  • 如果不修改結構成員的值,請將它們聲明為常量( let )。

  • 根據命名約定,變量應該被命名為lowerCamelCased snake_case轉換為camelCase的一種便捷方法是指定convertFromSnakeCase密鑰解碼策略。


openweathermap API 通過在 URL 中添加units=metric來提供攝氏度或通過添加units=imperial來提供華氏度。 例如

https://api.openweathermap.org/data/2.5/weather?q=London&units=metric&appid=•••••••••••••"

UNIX 時間戳(1592362322)可以通過指定secondsSince1970日期解碼策略解碼為Date

可以以這種簡單的形式創建結構

struct CityWeatherInfo: Decodable {
   let name: String
   let main: Main
   let weather: [Weather]
   let dt : Date
}

struct Weather: Decodable {
   let main: String
   let description: String
}

struct Main: Decodable {
   let temp, tempMin, tempMax, feelsLike : Double
}

並使用此代碼解碼數據

 do {
     let decoder = JSONDecoder()
     decoder.keyDecodingStrategy = .convertFromSnakeCase
     decoder.dateDecodingStrategy = .secondsSince1970
     let weatherInfo = try decoder.decode(CityWeatherInfo.self, from: data)
     print(weatherInfo)
 } catch {
    print(error)
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM