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

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

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

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

Q&A

解決済

1回答

298閲覧

SWIFT Could not cast value of type '__NSCFNumber' (0x10ad7a7d8) to 'NSDictionary' (0x10ad7b818). 202

dame-dame

総合スコア78

Swift

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

0グッド

0クリップ

投稿2020/02/16 09:31

こんにちは、bitflyerからapiでビットコインの価格を取得して表示させるプログラムを作っています。

https://api.bitflyer.com/v1/getboard/?product_code=BTC_JPY

というAPIを叩けば下記のように、mid_priceが出てきますので、この値を取り出して表示したいのです。

{
mid_price: 1102595,    <<この値を表示するだけ
bids: [
{
price: 1102405,
size: 0.4853
},

mid_priceが上記の場合、
jsonserializationでデータを取り出して、 "現在の価格:11102595" と表示させたいのですが
下記のエラーが出てきます

Could not cast value of type '__NSCFNumber' (0x10ad7a7d8) to 'NSDictionary' (0x10ad7b818).
2020-02-16 15:07:50.322692+0900

そもそも取り出したのは、String であってそれを表示させたいだけなのに、上記のようなエラーがでてきて困っています。

なにかヒントだけでもいいので手がかりがほしいのでお力添えいただければと思います

下記に私の書いたコードを添付します.よろしくお願いいたします

SWIFT

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var productCodeINput: UITextField! 6 @IBOutlet weak var CurrentPrice: UILabel! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view, typically from a nib. 11 } 12 13 14 @IBAction func findPrice(_ sender: Any) { 15 let url = "https://api.bitflyer.com/v1/getboard/?product_code=(productCodeINput.text!)" 16 getURL(url: url) 17 } 18 19 func getURL(url:String) { 20 do { 21 let apiURL = URL(string:url)! 22 let data = try Data(contentsOf:apiURL) 23 let json = try JSONSerialization.jsonObject(with: data) as! [String:Any] 24 print(json) 25 let price = json["mid_price"] as! [String:Any] 26 27 28 self.CurrentPrice.text = "現在の価格: (price)" 29 30 } catch { 31 self.CurrentPrice.text = "サーバーに接続できません" 32 } 33 } 34}

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

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

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

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

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

guest

回答1

0

ベストアンサー

let price = json["mid_price"] as! [String:Any]

let price = json["mid_price"] as! Double
にしたらどうでしょうか。

サーバーからくる情報を信用してしまって、as!を使うのは問題がありますが、とりあえず。

投稿2020/02/16 10:37

編集2020/02/16 11:09
eytyet

総合スコア803

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

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

dame-dame

2020/02/16 10:55

すごい、できました、どうしてString ではだめなのでしょうか?  別に価格情報をStringとして認識すること自体はもんだいないと思いますが、、、、、、
eytyet

2020/02/16 11:09

Stringではなくて、[String:Any] 型に変換しようとしたため、エラーになっていましたが、as! Stringとしてもダメでしょうね。 エラーメッセージから、JSONSerializaionがCFNumberとして出力しているようでしたので、as! Intにしました。いまちょっと調べたら、Doubleじゃないといけないようです。JSONは全部不動小数点らしいので。回答を修正しておきます。 JSONの仕様で、""でくくってないから数値なのですが、SwiftはJavascriptみたいに勝手に型変換をしないので、一旦数字でとっておいてからStringに変換するとよいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問