[iOS] Xcode 10.2 / iOS SDK 12.2 | Codableで Dictionary型のキーはキャメルケースに変換されない

2019/06/6

こんにちは。きんくまです。

Swift5はXcode10.2から使用可能で、先日アップデートしました。
それで、Xcode10.2でJSONからオブジェクトに変換するときの挙動がちょっと変わっていたので、共有です。


struct Sample: Codable {
    var keyName1: String?
    var keyName2: [String: String]?
    var keyName3: Child?
    
    struct Child: Codable {
        var chKeyName1: String?
        var chKeyName2: [String: String]?
        var chKeyName3: GrandChild?
    }
    
    struct GrandChild: Codable {
        var gcKeyName1: String?
        var gcKeyName2: [String: String]?
    }
}

        let jsonText = """
{
    "key_name1": "hello1",
    "key_name2": {
        "sub_child1": "hello2",
        "sub_child2": "hello3"
    },
    "key_name3": {
        "ch_key_name1": "hello4",
        "ch_key_name2": {
            "sub_child3": "hello5",
            "sub_child4": "hello6"
        },
        "ch_key_name3": {
            "gc_key_name1": "hello7",
            "gc_key_name2": {
                "sub_child5": "hello8",
                "sub_child6": "hello9"
            }
        }
    }
}
"""

        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        let textData = jsonText.data(using: .utf8)!
        do {
            let decodedSample = try decoder.decode(Sample.self, from: textData)

            //Xcode10.1まではこれでいけたのに、Xcode10.2だと空になる
            decodedSample.keyName2["subChild1"] // nil

            //Xcode10.2からはこちら
            decodedSample.keyName2["sub_child1"] // "hello2"

            //同様に辞書部分はキャメルケースでアクセス
            decodedSample.keyName3?.chKeyName3?.gcKeyName2?["sub_child5"]
        } catch let error {
            print("error \(error)")
        }

これについてテストしました。

Child型やGrandChild型といった型を定義したものであれば、JSONのプロパティ名がスネークケースのものが型のキャメルケースプロパティに入ります。(従来のまま)

ネストの状況も2階層、3階層とあってもしっかり変換されました!

しかし!型を定義していない辞書型の [String:String] とかだと、キーはキャメルケースに変換されずにスネークケースのままになります。OH!

しれっと、重要なところ変えてきたよリンゴさん!これで動かないアプリいっぱいあると思うよ!
リリースノートにも書いてなかったよw

参考)
Dictionary keys are no longer converted using keyDecodingStrategy under Xcode 10.2

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る