WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
Blog スタッフブログ
iOS
システム開発
ひとくちコードスニペット
[Swift]Codableのカスタムエンコード・デコード処理のコードスニペット

こんにちは、株式会社MIXシステム開発担当のBloomです。
今回はSwiftのCodableを継承したクラスでエンコード・デコード処理をカスタムしたい場合のコードスニペットを掲載させていただきます。
final class Information: Codable {
var id: Int = 0
var name: String = ""
var age: Int = 0
// uuidはアプリ内でだけ使う想定
var uuid: String = NSUUID().uuidString
enum CodingKeys: String, CodingKey {
case id
case name
case age
// uuidを定義しないことでカスタムエンコーダーやデコーダーを定義しなくても無視されるようになる
}
convenience init(from decoder: Decoder) throws {
self.init()
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id)
name = try container.decodeIfPresent(String.self, forKey: .name) ?? "" // API側で帰ってくる保証がないがアプリ側ではNonNullにしたいとき
age = try container.decode(Int.self, forKey: .age)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(name, forKey: .name)
try container.encode(age, forKey: .age)
}
}
これでAPIの仕様に応じて柔軟にモデルクラスを定義できます。良かったですね。