なんとかするから、なんとかなる

エンジニア関係のことを書きます

iOS Decodableで初期化したのに値が適用されない

背景

Decodableで構造体を初期化した際、値が代入されていなかったので、備忘録。

起きたこと

次のようなコードを書いたときに初期化時に値が入りませんでした。 json形式の値を受け取り、初期化したときに失敗しました。

struct SomeStruct: Decodable {
    let value: String = ""

    enum CodingKeys: String, CodingKey {
        case value
    }
}

原因

とても単純にメンバ変数はvarで宣言する必要があります。 なので、次のようなコードが正解です。

struct SomeStruct: Decodable {
    var value: String = ""

    enum CodingKeys: String, CodingKey {
        case value
    }
}

最後に

Decodableを使用したときに専用のイニシャライザが入るのかと思っていましたが、実際には初期化後に値を入れる処理が走るようですね。

しかも丁寧にletの場合にエラーで落ちないようにしてくれていますね。

気をつけましょう(唇を噛みながら)