課題
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
...
}