LoginSignup
0
1

More than 3 years have passed since last update.

CodableでdecodeしたときにJSON側のパラメータが足りなくても落ちないようにする

Last updated at Posted at 2020-03-06

追記-----------------------------
そもそもこんな面倒なことしなくても、

var path: String? = ""

にすれば落ちなくなるそうです。ご指摘ありがとうございます!
追記ここまで------------------------

何言ってるかよくわからないかもしれませんが。
自分で何やってるかもよくわかってないのでなんとなく書きます。

Codableを使ってJSONをデコードするときってこんなふうに書きますよね。↓


struct BoardStruct: Codable {
    var name: String = ""
    var path: String = ""
}

func() {
    let boardStruct = try! JSONDecoder().decode(BoardStruct.self, from: data)
}

でも、これだとJSONに指定のパラメータ、例えばpathがJSONに入ってこないとき、try!で落ちてしまうのです。
で、それを回避するためにやったこと。
structを以下のように書き換える。

struct BoardStruct: Codable {
    var name: String = ""
    var path: String = ""

    enum CodingKeys: String, CodingKey {
        case name
        case path
    }

    init(name: String, path: String) {
        self.name = name
        self.path = path
    }

    init(from decoder: Decoder) throws {
        let root = try decoder.container(keyedBy: CodingKeys.self)
        self.name = try root.decode(String.self, forKey: .name)
        // ↓ここでpathが入って来なくても落ちないようにする
        if let path = try? root.decode(String.self, forKey: .path) {
            self.path = path
        }
    }
}

以上です。
dcoderのinitを書くとデフォルトのinit(?)がなくなってしまうっぽいので自分で書き足しました。

0
1
2

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
0
1