Протокол Codable

Изменения в новых версиях / 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: [String: Any]) {
        guard let name = json["name"] as? String,
              let age = json["age"] as? Int else { return nil }
        self.name = name
        self.age = age
    }

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

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

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

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

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

    enum CodingKeys: String, CodingKey {
        case title
        case createdAt = "created_at"
    }
}