teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/05/12 11:21

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -8,4 +8,64 @@
8
8
  たとえば、下記のような感じです(ダウンキャストは必要に応じて施して頂けますでしょうか)。
9
9
  ```swift
10
10
  let data1 = data.value
11
+ ```
12
+
13
+ ---
14
+
15
+ 辞書からの値の取得ですが、たぶん難しく考えすぎていらっしゃるのではないでしょうか。
16
+ JSONのデータから `hits` をキーに取得されている処理は行われているので、同じように考えれば大丈夫です。
17
+
18
+ ```swift
19
+ / JSON の代わり
20
+ let jsonData = ["hits": ["data1": "いち", "data2": "に", "data3":"さん"]]
21
+ print(jsonData) //←コンソールに①の形式で表示される
22
+
23
+ //hitsの中身を全て取得したい
24
+ let productsData:[String:Any] = jsonData["hits"] ?? ["":""]
25
+ print(productsData) //←コンソールに②の形式で表示される
26
+
27
+ //取得した中身の数だけ各項目の値を取得したい
28
+ let data1 = productsData["data1"]
29
+ let data2 = productsData["data2"]
30
+ let data3 = productsData["data3"]
31
+ print(data1)
32
+ print(data2)
33
+ print(data3)
34
+ ```
35
+ 気をつけなければいけないのは、辞書から得られる値は `Optional` 型という点です(キーに相当する値がない場合 `nil` を返す)。
36
+
37
+ ---
38
+ あるいは、Swift4 以降であれば `Codable` を使うという手もあります。
39
+ こちらはあらかじめ `Codable` に準拠した構造体を作っておく必要がありますが、取得する JSON の構造が決まっているのであれば、プロパティ名でアクセスできるため取扱い(特に、JSONからのデコード)が容易になります。
40
+
41
+ ```swift
42
+ let data = """
43
+ {
44
+ "hits" : {
45
+ "data1": "いち",
46
+ "data2": "に",
47
+ "data3": "さん"
48
+ }
49
+ }
50
+ """.data(using: .utf8)!
51
+
52
+ struct jsonStruct: Codable {
53
+ var hits: Hits
54
+ }
55
+
56
+ struct Hits: Codable {
57
+ var data1: String
58
+ var data2: String
59
+ var data3: String
60
+ }
61
+
62
+ // この一行で終わり
63
+ let item = try! JSONDecoder().decode(jsonStruct.self, from: data)
64
+
65
+ let data1 = item.hits.data1
66
+ let data2 = item.hits.data2
67
+ let data3 = item.hits.data3
68
+ print(data1)
69
+ print(data2)
70
+ print(data3)
11
71
  ```