Изменения в новых версиях / Swift 4.0

// *** before: ***
// every type turned itself into a dictionary and back by hand
struct UserOld {
    let name: String
    let age: Int

    init?(json: [StringAny]) {
        guard let name = json["name"asString,
              let age = json["age"asInt else { return nil }
        self.name = name
        self.age = age
    }

    var json: [StringAny] { return ["name": name, "age": age] }
}

let raw = try JSONSerialization.jsonObject(with: data) as? [StringAny]
let userOld = raw.flatMap(UserOld.init(json:))

// *** in version 4.0: ***
struct UserCodable {
    let name: String
    let age: Int
}

let data = try JSONEncoder().encode(User(name: "Alina", age: 25))
let user = try JSONDecoder().decode(User.selffrom: data)
print(user.name)

// other names in the json are described once
struct PostCodable {
    let title: String
    let createdAt: Date

    enum CodingKeysString, CodingKey {
        case title
        case createdAt = "created_at"
    }
}