Swift 4 Decodable - Additional Variables

后端 未结 2 1122
小鲜肉
小鲜肉 2021-01-11 12:02

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

相关标签:
2条回答
  • 2021-01-11 12:21

    Actually, I'd make urlImage a lazy var. That way you don't have to worry about modifying the coding keys. All you have to do is write your getter, like so...

    struct Example1 : Decodable {
    
        var name : String?
        var url  : URL?    // Better than String
    
        lazy var urlImage: UIImage? = {
            // Put your image-loading code here using 'url'
        }()
    }
    
    0 讨论(0)
  • 2021-01-11 12:23

    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!
        }
    
    0 讨论(0)
提交回复
热议问题