Skip to content

Instantly share code, notes, and snippets.

@gokselkoksal
Last active May 26, 2018 17:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gokselkoksal/c165f7f6a0d433d8d0cffe04129dc4c7 to your computer and use it in GitHub Desktop.
Save gokselkoksal/c165f7f6a0d433d8d0cffe04129dc4c7 to your computer and use it in GitHub Desktop.
extension Place {
enum CodingKeys: String, CodingKey {
case name = "placeName"
case lat
case lon
case dateAdded
case info
}
static let dateAddedFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "YYYY-mm-dd"
return formatter
}()
static let decoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(Place.dateAddedFormatter)
return decoder
}()
static let encoder: JSONEncoder = {
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .formatted(Place.dateAddedFormatter)
return encoder
}()
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
let lat = try container.decode(Decimal.self, forKey: .lat)
let lon = try container.decode(Decimal.self, forKey: .lon)
coordinate = Coordinate(latitude: lat, longitude: lon)
dateAdded = try container.decode(Date.self, forKey: .dateAdded)
info = try container.decodeIfPresent(String.self, forKey: .info)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(coordinate.latitude, forKey: .lat)
try container.encode(coordinate.longitude, forKey: .lon)
try container.encode(name, forKey: .name)
try container.encode(dateAdded, forKey: .dateAdded)
try container.encodeIfPresent(info, forKey: .info)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment