Swiftのenumで種類が増えても落ちないようにしたい
次のようなenumをAPIから受け取ったJSONをパースして利用していたとします。
enum Kind: String, Decodable {
case note
case magazine
case circle
}
しかし、サーバーの都合で種類が増えてしまったらアプリ側ではパースができずにerrorをthrowしてしまいます。ちゃんとエラーハンドリングをしていれば落ちることはないですが、アプリから見ると異常値が渡され、元々表示されていたものが表示されなくなったりとユーザーにとっても不都合を与えてしまうかもしれません。
解決方法
そもそも安易に値が増えるものはenumで定義すべきじゃないのかもしれないですが、Swiftを利用している場合にはenumで定義していた方がメリットも多いですよね。そこで一旦次のようにothersを定義して、既存の表示には影響を与えずエラーが発生しないようにすることで対応しました。
enum Kind: Decodable {
case note
case magazine
case circle
case others(String)
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let value = try container.decode(String.self)
switch value {
case “note”:
self = .note
case “magazine”:
self = .magazine
case “circle”:
self = .circle
default:
self = .others(value)
}
}
}
全てのenumをこのように定義するのは大変なのであくまでも用法・用量を守って適切な場所で利用しましょう。