Создайте пример структуры с кодируемым полем

#json #swift

Вопрос:

У меня есть следующая структура, которая была автоматически создана из файла JSON:

 struct EmergencyNumberModel: Codable, Identifiable {  let id = UUID()  let country: Country  let ambulance: Ambulance  let fire: Fire  let police: Ambulance  let dispatch: Dispatch  let member112, localOnly: Bool  let notes: NotesUnion lt;lt;lt;lt;  let noData: Bool?  let traffic: Traffic?   enum CodingKeys: String, CodingKey {  case country = "Country"  case ambulance = "Ambulance"  case fire = "Fire"  case police = "Police"  case dispatch = "Dispatch"  case member112 = "Member_112"  case localOnly = "LocalOnly"  case notes = "Notes"  case noData = "NoData"  case traffic = "Traffic"  } }  

И чтобы использовать информацию из JSON в представлении, я создал функцию, которая возвращает пример с информацией:

 static func example() -gt; EmergencyNumberModel {  return EmergencyNumberModel(country: Country(name: "Japan", isoCode: "JP", isoNumeric: "392"),  ambulance: Ambulance(all: ["119"], gsm: nil),  fire: Fire(all: ["119"]),  police: Ambulance(all: ["110"], gsm: nil),  dispatch: Dispatch(all: [nil], fixed: nil, gsm: nil),  member112: false,  localOnly: false,  notes: NotesUnion, lt;lt;lt;lt;lt;lt;  noData: nil,  traffic: Traffic(all: ["122"])) }  

Но поле примечания в JSON иногда отсутствует или имеет разные типы, примечания в JSON выглядят следующим образом:

 "Notes": ""  

или вот так:

 "Notes": false  

И из-за этого генератор структуры создал это:

 enum NotesUnion: Codable {  case bool(Bool)  case enumeration(NotesEnum)  case null   init(from decoder: Decoder) throws {  let container = try decoder.singleValueContainer()  if let x = try? container.decode(Bool.self) {  self = .bool(x)  return  }  if let x = try? container.decode(NotesEnum.self) {  self = .enumeration(x)  return  }  if container.decodeNil() {  self = .null  return  }  throw DecodingError.typeMismatch(NotesUnion.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for NotesUnion"))  }   func encode(to encoder: Encoder) throws {  var container = encoder.singleValueContainer()  switch self {  case .bool(let x):  try container.encode(x)  case .enumeration(let x):  try container.encode(x)  case .null:  try container.encodeNil()  }  } }  enum NotesEnum: String, Codable {  case empty = ""  case uninhabited = "Uninhabited" }  

Я немного исследовал и теперь знаю, что код предназначен для преобразования между типами JSON и Swift.

Когда я автоматически заполняю тип объединения заметок, Xcode выдает мне это:

 NotesUnion(from: Decoder)  

Какой тип декодера мне нужен, чтобы иметь возможность сгенерировать пример, чтобы использовать его в представлении?

Комментарии:

1. Вы сами так не называете, используйте JSONDecoder().decode(...)