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

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

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

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2199閲覧

AlamofireでAPI通信して取得したjson型データを配列へ格納したい

takhub

総合スコア28

JSON

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2016/09/21 12:51

編集2016/09/21 13:45

###前提・実現したいこと
SwiftでAPI通信しています。
取得した値を配列へ格納したいのですが上手くいきません。

###発生している問題・エラーメッセージ

配列に書き込むところで下記のメッセージが吐かれ、処理が落ちてしまいます。

(lldb)

###該当のソースコード

swift

1Alamofire.request(.GET, URL, parameters: parameters) 2 .responseJSON { response in 3 guard let object = response.result.value else { 4 return 5 } 6 let json = JSON(object) 7 json.forEach { (_, json) in 8 let nutrition: [String: String?] = 9 ["food_id": json["food_id"]["value"].string, 10 "vitamin_c": json["food"]["servings"]["serving"]["vitamin_c"].string 11 ] 12 self.nutritions.append(nutrition) 13 } 14 vitamin_c = json["food"]["servings"]["serving"]["vitamin_c"].string! 15 16 self.barChartView.delegate = self 17 18 self.parameter = ["Protein", "Fat", "Carb", "Vitamin", "Mineral"] 19 //① 20 let unitsSold = [12.0, 4.0, 6.0, vitamin_c!, 12.0] 21 //② 22 self.setChart(self.parameter, values: unitsSold as! [Double]) 23 }

###試したこと
①の位置でprint(vitamin_c!)したところ、問題なく値(10)が取得されました。
配列内でも同様にvitamin_c!と記述しているにも関わらず処理が止まってしまいます。
ちなみに、配列内のvitamin_c!を任意の数字にすると問題なく動作します。

###補足情報(言語/FW/ツール等のバージョンなど)
利用したライブラリは下記です。

Alamofire:3.4
SwiftyJSON

以上よろしくお願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は型が違うからだと思います。

配列がDouble型の配列でvitamin_cString型だからだと思いますよ。
試しに以下のようにキャストしたらいかがでしょうか?

swift

1let unitsSold = [12.0, 4.0, 6.0, Double(vitamin_c)!, 12.0]

投稿2016/09/21 13:31

編集2016/09/21 13:36
_Kentarou

総合スコア8490

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

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

takhub

2016/09/21 13:37

_Kentarouさん、早速ありがとうございます。 すみません、コードを省略していたのですが、上記コードのあとでDouble型に変換しています。それでも上手くいかないのです。
_Kentarou

2016/09/21 13:45

入れる時に型を合わせないとダメだと思いますが…記載した例でも上手くいきませんか?
takhub

2016/09/21 13:57 編集

そうなんですね。。。失礼しました。 ②の下での as! [Double]を削除した上で、 ご教示いただいた通り①の下でFloatにしました。 今度は、②の下の "unitsSold" の部分が、 Cannot convert value of type '[Float?]' to expected argument type '[Double]' とエラーがでるため、ならばとDouble型にすると、 Cannot convert value of type '[Double?]' to expected argument type '[Double]' とエラーがでてしまいます。 Double(vitamin_c!)、とアンラップしているのですが。。。
_Kentarou

2016/09/21 13:57

Double(vitamin_c!)ではなくて、Double(vitamin_c)!ではどうでしょうか?
takhub

2016/09/21 14:00

Double(vitamin_c)!とすると、エラーになり、 "Fix-it Insert "!" とレコメンドされたため、 Double(vitamin_c!)!とすると無事に通りました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問