Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 4 Decodable - Additional Variables

Something I havent figured out or have been able to find online as of yet.

Is there a way to add additional fields onto a struct containing the decodable protocol in which are not present in the JSON Data?

For example and simplicity, say I have an array of json objects structured as such

{ "name": "name1", "url": "www.google.com/randomImage" }

but say I want to add a UIImage variable to that struct containing the decodable such as

struct Example1: Decodable {
    var name: String?
    var url: String?
    var urlImage: UIImage? //To add later
}

Is there a way to implement the decodable protocol in order to get the name and url from the JSON but allow me to add the UIImage later?

like image 982
Rykuno Avatar asked Sep 07 '17 20:09

Rykuno


1 Answers

To exclude urlImage you must manually conform to Decodable instead of letting its requirements be synthesized:

struct Example1 : Decodable { //(types should be capitalized)
    var name: String?
    var url: URL? //try the `URL` type! it's codable and much better than `String` for storing URLs
    var urlImage: UIImage? //not decoded

    private enum CodingKeys: String, CodingKey { case name, url } //this is usually synthesized, but we have to define it ourselves to exclude `urlImage`
}

Before Swift 4.1 this only works if you add = nil to urlImage, even though the default value of nil is usually assumed for optional properties.

If you want to provide a value for urlImage at initialization, rather than using = nil, you can also manually define the initializer:

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        url = try container.decode(URL.self, forKey: .url)
        urlImage = //whatever you want!
    }
like image 91
andyvn22 Avatar answered Sep 18 '22 18:09

andyvn22