Learn how to encode, decode and serialize data in Swift 4!
This is a companion discussion topic for the original entry at https://www.raywenderlich.com/382-encoding-decoding-and-serialization-in-swift-4
Learn how to encode, decode and serialize data in Swift 4!
Thanks so much.
no need be codable
properties restore within the instance?User
struct with some properties like id
, name
and so on, it has many properties but I need only some be coded/encoded, if I conformed the Codable
protocol, I must implement CodingKeys
and encode/decode all the properties.Follow is my solution:
extension GitHubUser: Decodable{
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decode(Int.self, forKey: .id)
type = try values.decode(String.self, forKey: .type)
loginName = try values.decode(String.self, forKey: .loginName)
avatarUrl = try values.decode(String.self, forKey: .avatarUrl)
homepageUrl = try values.decode(String.self, forKey: .homepageUrl)
profileUrl = try values.decode(String.self, forKey: .profileUrl)
// optional decodable properties operation
do {
name = try values.decode(String.self, forKey: .name)
}catch{
name = ""
}
do {
company = try values.decode(String.self, forKey: .company)
}catch{
company = ""
}
do {
location = try values.decode(String.self, forKey: .location)
}catch{
location = ""
}
do{
blog = try values.decode(String.self, forKey: .blog)
}catch{
blog = ""
}
do{
bio = try values.decode(String.self, forKey: .bio)
}catch{
bio = ""
}
}
}
just make them optional
is it good idea to just use extention so we will not use
extension Encodable {
var jsonData: Data? {
let encoder = JSONEncoder()
do {
return try encoder.encode(self)
} catch {
print(error.localizedDescription)
return nil
}
}
var jsonString: String? {
guard let data = self.jsonData else { return nil }
return String(data: data, encoding: .utf8)
}
}
extension Decodable {
static func from(json: String, using encoding: String.Encoding = .utf8) -> Self? {
guard let data = json.data(using: encoding) else { return nil }
return Self.from(data: data)
}
static func from(data: Data) -> Self? {
let decoder = JSONDecoder()
do {
return try decoder.decode(Self.self, from: data)
} catch {
print(error.localizedDescription)
return nil
}
}
}
This tutorial is more than six months old so questions are no longer supported at the moment for it. Thank you!