質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1156閲覧

as? [String: Any] は、何故ダウンキャストなのか他【JSON】

kazuki_user

総合スコア147

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/17 23:16

編集2020/08/17 23:28

質問は2点です。

## ① as? [String: Any] は、何故ダウンキャストなのか。

以下の記事によると、「より具体的な型」にするのがダウンキャスト(?, !)と書かれていますが、

  • JSON解析にてas? [String: Any]は、何故ダウンキャストなのか、教えて頂きたいです。

【Swift入門 文法編】型キャスト(as, as!, as?)をマスターしよう

  • JSONデータには、整数や文字列など様々な型が混ぜっているからAnyにキャストする、という認識で合っていますか?

  • もしそうなら、「より汎用的な型」にするアップキャストは何故使わないの? と思ってしまいました。

## ② キャストをしなくても、JSONデータが同じ?

swift

1guard let jsonAny = json as? [String: Any] else { return }

キャストをせずにprint(json)を実行しても、同じJSONデータが得られました。
何故キャストは必要なのでしょうか。

StarWarsApi

1{ 2 "birth_year" = 19BBY; 3 created = "2014-12-09T13:50:51.644000Z"; 4 edited = "2014-12-20T21:17:56.891000Z"; 5 "eye_color" = blue; 6 films = ( 7 "http://swapi.dev/api/films/1/", 8 "http://swapi.dev/api/films/2/", 9 "http://swapi.dev/api/films/3/", 10 "http://swapi.dev/api/films/6/" 11 ); 12 gender = male; 13 "hair_color" = blond; 14 height = 172; 15 homeworld = "http://swapi.dev/api/planets/1/"; 16 mass = 77; 17 name = "Luke Skywalker"; 18 "skin_color" = fair; 19 species = ( 20 ); 21 starships = ( 22 "http://swapi.dev/api/starships/12/", 23 "http://swapi.dev/api/starships/22/" 24 ); 25 url = "http://swapi.dev/api/people/1/"; 26 vehicles = ( 27 "http://swapi.dev/api/vehicles/14/", 28 "http://swapi.dev/api/vehicles/30/" 29 ); 30} 31

## コード

swift

1 do { 2 let json = try JSONSerialization.jsonObject(with: data, options: []) 3 guard let jsonAny = json as? [String: Any] else { return } 4          print(json) 5 6 } catch { 7 debugPrint(error.localizedDescription) 8 return 9 }

質問は以上です。
お時間あるときに、ご返信頂けましたら幸いです????

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

1, あなたがJSONの詳細を知っていてもコンパイラは知りません。コンパイラにそれを教えるためのキャストです。

2, 実行時にはコンパイル時とは別の実行時にしか存在しない情報源により型を特定しています。jsonがAnyのままでもprint(json)で同じ出力が得られるのはそのためです。
実行時にしか存在しないのでコンパイル時には利用できません。

投稿2020/08/18 02:40

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リファレンスによると、
JSONSerialization.jsonObject(with, options)の返り値はAny型です。
これを[String: Any]型(=Dictionary<String, Any>型)にダウンキャストしてます。
きっと、

swift

1let とあるキーの値 = jsonAny["キー"]

みたいな使い方を後々やりたいんでしょう

投稿2020/08/17 23:33

ozwk

総合スコア13532

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問