AnyCodingKey

A CodingKey for any encoding or decoding container.

Overview

AnyCodingKey provides a wrapper for a String (and optionally an Int), and conforms to CodingKey. It allows easy creation of arbitrary keys for KeyedDecodingContainer and KeyedEncodingContainer, or for use in coding paths. AnyCodingKey conforms to ExpressibleByStringLiteral and ExpressibleByIntegerLiteral to make use particularly easy.

Common Use Cases

Avoiding manual CodingKey enums

struct Pokemon: Decodable {
    let number, name, species: String
    let types: [String]

    init(from decoder: Decoder) throws {
        // Create a KeyedDecodingContainer keyed by AnyCodingKey.
        let c = try decoder.anyKeyedContainer()

        // Use String literals to create AnyCodingKeys
        number = try c.decode(String.self, forKey: "number")
        name = try c.decode(String.self, forKey: "name")
        species = try c.decode(String.self, forKey: "species")
        types = try c.decode([String].self, forKey: "types")
    }
}

Adding AnyCodingKey as a Dependency

To use the AnyCodingKey library in a SwiftPM project, add the following line to the dependencies in your Package.swift file:

.package(url: "https://github.com/RNCodable/AnyCodingKey", from: "1.0.0"),

Include "AnyCodingKey" as a dependency for your executable target:

.target(name: "<target>", dependencies: [
    .product(name: "AnyCodingKey"),
]),

Finally, add import AnyCodingKey to your source code.

GitHub

View Github