Skip to content

Instantly share code, notes, and snippets.

@azamsharp
Last active September 14, 2018 17:12
Show Gist options
  • Save azamsharp/1fa78e3c28e322b9d1167d4c5fc54f5a to your computer and use it in GitHub Desktop.
Save azamsharp/1fa78e3c28e322b9d1167d4c5fc54f5a to your computer and use it in GitHub Desktop.
unwrapping
import UIKit
let jsonData :Data = """
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
}
}
""".data(using: .utf8)!
struct User :Decodable {
let id :Int
let name :String
let userName :String
let email :String
let street :String
let suite :String
let city :String
let zipCode :String
public init(from decoder :Decoder) throws {
let userContainer = try decoder.container(keyedBy: UserKeys.self)
self.id = try userContainer.decode(Int.self, forKey: .id)
self.name = try userContainer.decode(String.self, forKey: .name)
self.userName = try userContainer.decode(String.self, forKey: .name)
self.email = try userContainer.decode(String.self, forKey: .email)
let addressContainer = try userContainer.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)
self.street = try addressContainer.decode(String.self, forKey: .street)
self.suite = try addressContainer.decode(String.self, forKey: .suite)
self.city = try addressContainer.decode(String.self, forKey: .city)
self.zipCode = try addressContainer.decode(String.self, forKey: .zipCode)
}
private enum UserKeys :String, CodingKey {
case id
case name
case userName = "username"
case email
case address
}
private enum AddressKeys :String, CodingKey {
case street
case suite
case city
case zipCode = "zipcode"
}
}
if let user = try? JSONDecoder().decode(User.self, from: jsonData) {
print(user.name)
print(user.userName)
print(user.street)
} else {
print("error")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment