回答編集履歴

1

追記

2020/05/12 11:21

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -19,3 +19,123 @@
19
19
  let data1 = data.value
20
20
 
21
21
  ```
22
+
23
+
24
+
25
+ ---
26
+
27
+
28
+
29
+ 辞書からの値の取得ですが、たぶん難しく考えすぎていらっしゃるのではないでしょうか。
30
+
31
+ JSONのデータから `hits` をキーに取得されている処理は行われているので、同じように考えれば大丈夫です。
32
+
33
+
34
+
35
+ ```swift
36
+
37
+ / JSON の代わり
38
+
39
+ let jsonData = ["hits": ["data1": "いち", "data2": "に", "data3":"さん"]]
40
+
41
+ print(jsonData) //←コンソールに①の形式で表示される
42
+
43
+
44
+
45
+ //hitsの中身を全て取得したい
46
+
47
+ let productsData:[String:Any] = jsonData["hits"] ?? ["":""]
48
+
49
+ print(productsData) //←コンソールに②の形式で表示される
50
+
51
+
52
+
53
+ //取得した中身の数だけ各項目の値を取得したい
54
+
55
+ let data1 = productsData["data1"]
56
+
57
+ let data2 = productsData["data2"]
58
+
59
+ let data3 = productsData["data3"]
60
+
61
+ print(data1)
62
+
63
+ print(data2)
64
+
65
+ print(data3)
66
+
67
+ ```
68
+
69
+ 気をつけなければいけないのは、辞書から得られる値は `Optional` 型という点です(キーに相当する値がない場合 `nil` を返す)。
70
+
71
+
72
+
73
+ ---
74
+
75
+ あるいは、Swift4 以降であれば `Codable` を使うという手もあります。
76
+
77
+ こちらはあらかじめ `Codable` に準拠した構造体を作っておく必要がありますが、取得する JSON の構造が決まっているのであれば、プロパティ名でアクセスできるため取扱い(特に、JSONからのデコード)が容易になります。
78
+
79
+
80
+
81
+ ```swift
82
+
83
+ let data = """
84
+
85
+ {
86
+
87
+ "hits" : {
88
+
89
+ "data1": "いち",
90
+
91
+ "data2": "に",
92
+
93
+ "data3": "さん"
94
+
95
+ }
96
+
97
+ }
98
+
99
+ """.data(using: .utf8)!
100
+
101
+
102
+
103
+ struct jsonStruct: Codable {
104
+
105
+ var hits: Hits
106
+
107
+ }
108
+
109
+
110
+
111
+ struct Hits: Codable {
112
+
113
+ var data1: String
114
+
115
+ var data2: String
116
+
117
+ var data3: String
118
+
119
+ }
120
+
121
+
122
+
123
+ // この一行で終わり
124
+
125
+ let item = try! JSONDecoder().decode(jsonStruct.self, from: data)
126
+
127
+
128
+
129
+ let data1 = item.hits.data1
130
+
131
+ let data2 = item.hits.data2
132
+
133
+ let data3 = item.hits.data3
134
+
135
+ print(data1)
136
+
137
+ print(data2)
138
+
139
+ print(data3)
140
+
141
+ ```