Easy failable optional enum properties in Swift Codable.
You can add CodableNilOnFail to an Xcode project by adding it as a package dependency.
- From the File menu, select Add Packages…
- Enter
https://github.com/sochalewski/CodableNilOnFail
into the package repository URL text field. - Add the package to your app target.
Consider the following data model:
struct Car: Codable {
enum Manufacturer: String, Codable {
case toyota, volkswagen, ford, honda, generalMotors
}
var manufacturer: Manufacturer?
var vin: String?
var owner: String?
}
Everything works perfectly if the received JSON matches the available Manufacturer
enum values, like this:
{
"manufacturer": "toyota",
"vin": "JT4RN67S0G0002845",
"owner": null
}
But Car.manufacturer
is optional, so it makes sense to have a valid model, even if the received manufacturer doesn't match one of the currently supported ones:
{
"manufacturer": "tesla",
"vin": "5YJSA2DP8DFP22249",
"owner": "Elon Musk"
}
Unfortunately decoding this with JSONDecoder
results in getting nil
for the whole Car
instead of just Car.manufacturer
.
This can be solved by custom init(from:)
of the Decodable
protocol, but that's a lot of boilerplate, especially when you have dozens of enums in your models.
This is where CodableNilOnFail comes in!
Just add the @NilOnFail
property wrapper to your optional RawRepresentable
properties.
struct Car: Codable, Equatable {
enum Manufacturer: String, Codable {
case toyota, volkswagen, ford, honda, generalMotors
}
@NilOnFail var manufacturer: Manufacturer?
var vin: String?
var owner: String?
}
Piotr Sochalewski, sochalewski.github.io