改良の余地は十分になるとおもいますし、もっと良い指摘も入るかと思いますが、こんな感じでいかがでしょうか。
上記の記事にはお世話になっていますし、今回も参考にしました。
Swift
1 import UIKit
2
3 let data = "" "
4 [
5 {
6 "model" : "iPhone X" ,
7 "capacity" : "64"
8 } ,
9 {
10 "model" : "iPhone 7" ,
11 "capacity" : 128
12 } ,
13 {
14 "model" : "iPhone 6" ,
15 "capacity" : - 128
16 } ,
17 {
18 "model" : "iPhone 5" ,
19 "capacity" : "-128"
20 }
21 ]
22 "" " . data ( using : . utf8 ) !
23
24
25 struct Device : Codable {
26 var model : String
27 var capacity : Int
28
29 private enum CodingKeys : String , CodingKey {
30 case model
31 case capacity
32 }
33
34 init ( from decoder : Decoder ) throws {
35 let values = try decoder . container ( keyedBy : CodingKeys . self )
36 model = try values . decode ( String . self , forKey : . model )
37 if let cap = try ? values . decode ( Int . self , forKey : . capacity ) {
38 capacity = cap
39 } else {
40 capacity = Int ( try values . decode ( String . self , forKey : . capacity ) ) ? ? 0
41 }
42 }
43
44 func encode ( to encoder : Encoder ) throws {
45 var container = encoder . container ( keyedBy : CodingKeys . self )
46 try container . encode ( model , forKey : . model )
47 try container . encode ( capacity . description , forKey : . capacity )
48 }
49 }
50
51
52 if let device = try ? JSONDecoder ( ) . decode ( [ Device ] . self , from : data ) {
53 device . forEach { dev in print ( "モデル: (dev.model)\nメモリ: (dev.capacity)" ) }
54 }
55 // 実行結果
56 //モデル: iPhone X
57 //メモリ: 64
58 //モデル: iPhone 7
59 //メモリ: 128
60 //モデル: iPhone 6
61 //メモリ: -128
62 //モデル: iPhone 5
63 //メモリ: -128