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

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

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

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

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

Q&A

2回答

2138閲覧

Swiftにおけるdictionary型のダウンキャストの成功について

mememehollow

総合スコア6

JSON

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

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

0グッド

1クリップ

投稿2020/04/19 03:49

編集2020/04/19 06:46

###var cast = Dictionary<String, AnyObject> as? Stringが成功する場合、どんなデータが入るのか。

情報系初心者の学生です。
ど素人質問でごめんなさい、

質問はvar cast = Dictionary<String, AnyObject> as? Stringが成功する場合、どんなデータが入るのか知りたいということです。

###コード

以下のようなコードを書き、playgroundで実行しました。

Swift

1class Sample { 2 var _name : String 3 4 init(_ name: String) { 5 self._name = name 6 } 7 8 subscript(msg:String) -> String { 9 return "(_name)さん、(msg)" 10 } 11} 12 13class Sample2 { 14 15 var _name :String 16 17 init(_ name: String) { 18 _name = name 19 } 20 21 subscript(msg:String) -> String { 22 return "(_name)さん、(msg)" 23 } 24 25 subscript(x:Int, y:Int) -> Int { 26 return x * y / 2 27 } 28} 29 30var smp = Sample(name: "hoge") 31var smp2 = Sample2("foo") 32 33var dict2:Dictionary<String, AnyObject> = ["smp": smp, "smp2":smp2] 34var cast = dict2 as? String

http://hamasyou.com/blog/2014/08/28/swift-dictionary-anyobject/ というサイトをみてて、ふと疑問に思ってdictionary<String, AnyObject>型からString型にダウンキャストした際、cast中のデータはどうなっているんだろうと思い、上のようなコードを試しました。
今回、上のようなコードを実行して変数castの中がnilとなってしまいました。
なので、nilが入らない場合はどのようになっているのか知りたいです。

###この質問に至った経緯
jsonの勉強をしているのですが、このようなダウンキャストが多く見受けられたからです。
まだ、あまりjsonのことも詳しくわかっていないのですが、答えていただければ嬉しいです。どうかお願いします。

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

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

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

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

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

guest

回答2

0

Dictionary型(辞書)をString型に変換できないのはnakasho_devさんがご指摘のとおりです。
両者には直接的な関係がないため(継承関係はなく、またそもそもDictionaryもStringも構造体なので継承が存在しない)、ダウンキャストはできません。

別の質問でAlamofire経由で得られたJSONのご質問をされていますが、その例から考えるとクラスを作らなくとも、次のような例題で様々なダウンキャストが用いられていることがわかるのではないかと思います。

swift

1import UIKit 2 3// someData は値が混在しているため、[String: AnyObject?]型の辞書となる 4var someData = [["value": 12345], ["value": "ABCDE"], ["value": 0x0123], ["value": "0x0123"], ["value": nil]] 5// ちなみに、値にnilが含まれなければ[String: AnyObject]型の辞書となる。 6//var someData2 = [["value": 12345], ["value": "ABCDE"], ["value": 0x0123], ["value": "0x0123"]] 7 8 9for i in 0..<someData.count { 10 if let value = someData[i]["value"] as? Int { 11 print("[(i)]番目の要素: Int型で値は(value)") 12 } else if let value = someData[i]["value"] as? String { 13 print("[(i)]番目の要素: String型で値は(value)") 14 } else { 15 print("[(i)]番目の要素: Int型でもString型でもありませんでした。") 16 } 17}

投稿2020/04/19 09:26

TsukubaDepot

総合スコア5086

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

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

0

Dictionary<String, AnyObject>型であるdict2をString型にCastできるわけないのでCastが失敗し、as?でOptional宣言をしているからnilが返っているだけです。
それぞれの値をとるには個別にCastしてあげる必要があります。

Swift

1var smpValue = dict2["smp"] as? Sample 2var smp2Value = dict2["smp2"] as? Sample2 3

SampleとSample2は関係のないクラスなのでDictionary<String, AnyObject>をDictionary<String, Sample>とかDictionary<String, Sample2>にはキャストできません。
Sample2がSampleを継承していれば
Dictionary<String, AnyObject>型をDictionary<String, Sample>でCastできるはずです。

投稿2020/04/19 09:06

nakasho_dev

総合スコア2655

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

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

mememehollow

2020/04/24 02:37

お礼が遅くなってしまい申し訳ありません。 クラスの関係でキャストが出来るか否かということについて理解できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問