web-dev-qa-db-ja.com

Swift 4デコード可能-追加の変数

私がまだ理解していないか、オンラインで見つけることができた何か。

JSONデータに存在しないデコード可能なプロトコルを含む構造体にフィールドを追加する方法はありますか?

たとえば、簡単に言うと、そのように構造化されたjsonオブジェクトの配列があるとします。

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

しかし、次のようなデコード可能なものを含むその構造体にUIImage変数を追加したいとします。

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

JSONから名前とURLを取得するためにデコード可能なプロトコルを実装する方法はありますが、後でUIImageを追加できますか?

11
Rykuno

urlImageを除外するには、要件を合成させるのではなく、手動でDecodableに準拠する必要があります。

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`
}

Swift 4.1)より前は、これは= nilurlImageに追加した場合にのみ機能しますが、オプションのプロパティには通常デフォルト値のnilが想定されています。

= nilを使用するのではなく、初期化時にurlImageの値を指定する場合は、初期化子を手動で定義することもできます。

    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!
    }
14
andyvn22

実際、私はurlImageを怠惰な変数にします。そうすれば、コーディングキーの変更について心配する必要はありません。あなたがしなければならないのは、そのようにあなたのゲッターを書くことです...

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
Mark A. Donohoe