/ swift

Codable Improvements in Swift 4.1

Since writing The Ultimate Guide to JSON Parsing in Swift 4, many people have asked me to ask questions about how to properly represent their API with Decodable models.

There's often a hesitation to add a custom CodingKeys enumeration, which is essentially inevitable because our APIs often use different naming strategies than our Swift apps.

So essentially all of our models would end up defining a CodingKeys enumeration simply to translate between snake_case and camelCase representations of the properties.

In Swift 4.1, however, Apple has addressed this most common point of customization with the new .keyDecodingStrategy on JSONDecoder.

So if you have this JSON response:

{
   "beer": {
       "brewery_name": "Lone Pint",
       "name": "Yellow Rose",
       "beer_style": "IPA"
   }
}

You can now decode this without defining your own CodingKeys

struct Beer : Decodable {
    let breweryName: String
    let name: String
    let beerStyle: String
}

You specify the key strategy before decoding and the decoder will do the work for you.

let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
let beer = try jsonDecoder.decode(Beer.self, from: response)

The opposite also works, if you want to take the Beer instance and serialize that to JSON for posting to the server:

let jsonEncoder = JSONEncoder()
jsonEncoder.keyEncodingStrategy = .convertToSnakeCase
let json = try jsonEncoder.encode(beer)

This new feature is a welcome addition that will be a sensible default for most users. Of course, it won't work for every API (it's a wild world out there), but it should be easy enough to drop down to implementing CodingKeys if you need full control. Alternatively, you can create your own key encoding/decoding strategies if you have a different format you need to work with.

Swift 4.1 is still in beta, so if you want to play with this feature, you'll have to download Xcode 9.3 beta.