4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Decodableで未知のenumの値がきたときの対策

Posted at

課題

APIのレスポンスをDecodableを使ってstructにdecodeしたりしますよね。
そのstructにenumが含まれていた場合にこんな感じになります。

struct Hoge: Decodable {
  enum Type: String, Decodable {
    case type1
    case type2
  }

  let type: Type
  ...
}

しかし、将来的に仕様の追加があり、typeの種類が増やしてしまうと、上記のようにしていると過去にリリースしたアプリがdecodeに失敗してしまいます。

enumの種類が増やすということはAPIの後方互換性のない変更となるので、クライアント側からするとこれは致し方ない問題ではあります。

が、諸事情で、decode失敗ではなく知らないenumが来たとき用の処理を入れておいてAPIバージョンあげずにAPI変更したいケースがもしかしたらあるかもしれない・・・のでそのときの対策です。

対策

なんでもよいのですがunknownのように知らないenumの値用のcaseを追加します。
そしてinit(from decoder)を実装し、decodeに失敗したときに追加したcaseになるようにします。

struct Hoge: Decodable {
  enum Type: String, Decodable {
    case type1
    case type2
    case unknown

    init(from decoder: Decoder) throws {
      self = try DisplayPosition(rawValue: decoder.singleValueContainer().decode(RawValue.self)) ?? .unknown
    }
  }

  let type: Type
  ...
}
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?