Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tedgonzalez/e3d5580235fe884c6f1b247b6db1baca to your computer and use it in GitHub Desktop.
Save tedgonzalez/e3d5580235fe884c6f1b247b6db1baca to your computer and use it in GitHub Desktop.
enum OrderItem: Decodable, Equatable {
case food(FoodDelivery)
case package(PackageDelivery)
case passenger(PassengerDelivery)
enum CodingKeys: CodingKey, CaseIterable {
case food
case package
case passenger
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let value = try container.decodeIfPresent(FoodDelivery.self, forKey: .food) {
self = OrderItem.food(value)
return
}
if let value = try container.decodeIfPresent(PackageDelivery.self, forKey: .package) {
self = OrderItem.package(value)
return
}
if let value = try container.decodeIfPresent(PassengerDelivery.self, forKey: .passenger) {
self = OrderItem.passenger(value)
return
}
throw DecodingError.valueNotFound(Self.self, DecodingError.Context(codingPath: CodingKeys.allCases, debugDescription: "food/package/passenger not found"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment