見出し画像

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をこのように定義するのは大変なのであくまでも用法・用量を守って適切な場所で利用しましょう。


この記事が気に入ったらサポートをしてみませんか?