I have a Codable class that looks like this:
import Foundation
struct MyClass: Decodable {
let name: String
let time: Date
let sometimesPresent1: Double?
let sometimesPresent2: Double?
let sometimesPresent3: Double?
enum DecodingKeys: String, CodingKey {
case name, time, sometimesPresent1, sometimesPresent2, sometimesPresent3
}
public init(from decoder: Decoder) throws {
self.time = Date()
let container = try decoder.container(keyedBy: DecodingKeys.self)
name = try container.decode(String.self, forKey: .name)
// TODO: Is there any cleaner way to write the below?
do { // These keys are sometimes altogether missing from the JSON returned by the exchange
self.sometimesPresent1 = try container.decode(Double?.self, forKey: .sometimesPresent1)
} catch {
self.sometimesPresent1 = nil
}
do {
self.sometimesPresent2 = try container.decode(Double?.self, forKey: .sometimesPresent2)
} catch {
self.sometimesPresent2 = nil
}
do {
self.sometimesPresent3 = try container.decode(Double?.self, forKey: .sometimesPresent3)
} catch {
self.sometimesPresent3 = nil
}
}
}
The keys sometimesPresent 1, 2, and 3 are keys that are sometimes provided in the data and sometimes missing altogether. It's also possible the key will be present with the value null.
Is there any cleaner way to deal with keys that may or may not be present in the JSON? My actual use case has 5 such keys so the code becomes very verbose with five do/catch statements stacked on top of one another.