こんにちは。きんくまです。
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
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ