私がまだ理解していないか、オンラインで見つけることができた何か。
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を追加できますか?
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)より前は、これは= nil
をurlImage
に追加した場合にのみ機能しますが、オプションのプロパティには通常デフォルト値の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!
}
実際、私は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'
}()
}