前提・実現したいこと
JSONを使ってGoogleスプレッドシートのデータを取得し、それをグラフ表示するiOSアプリ作っています。
発生している問題・エラーメッセージ
このページリンク内容を参考にさせてもらい、データの代入部分は自分で作ったJSONデータを取得するクラスに変えて、コンパイルは通るのですが、"Thread 1: signal SIGABRT"のエラーが出てアプリが動きません。
また、横軸の配列の型をDouble型ではなく、String型に変更したいのですが、どうすれば良いのかご教授いただければ幸いです。
以下、当該のソースコードです。
該当のソースコード
/*ViewController.swift*/ import UIKit import Charts class ViewController: UIViewController { var chart: CombinedChartView! var lineDataSet: LineChartDataSet! var bubbleDataSet: BubbleChartDataSet! override func viewDidLoad() { super.viewDidLoad() //combinedDataを結合グラフに設定する let combinedData = CombinedChartData() //結合グラフに線グラフのデータ読み出し combinedData.lineData = generateLineData() //グラフのサイズ設定、座標設定 chart = CombinedChartView(frame: CGRect(x: 0, y: 20, width: self.view.frame.width , height: self.view.frame.height - 20)) //chartのデータにcombinedDataを挿入する chart.data = combinedData //chartを出力 self.view.addSubview(chart) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func generateLineData() -> LineChartData { //リストを作り、グラフのデータを追加する方法(GitHubにあったCombinedChartViewとかMPAndroidChartのwikiを参考にしている //データを入れていく、多重配列ではないため別々にデータは追加していく let values: [Double] = GetFarmData().DateArray let date : [Double] = GetFarmData().TempArray //DataSetを行うために必要なEntryの変数を作る データによって入れるデータが違うため複数のentriesが必要になる? var entries: [ChartDataEntry] = Array() for (i, value) in values.enumerated(){ entries.append(ChartDataEntry(x: date[i], y: value, icon: UIImage(named: "icon", in: Bundle(for: self.classForCoder), compatibleWith: nil))) } //データを送るためのDataSet変数をリストで作る var linedata: [LineChartDataSet] = Array() //リストにデータを入れるためにデータを成形している //データの数値と名前を決める lineDataSet = LineChartDataSet(values: entries, label: "Line chart unit test data") lineDataSet.drawIconsEnabled = false //グラフの線の色とマルの色を変えている lineDataSet.colors = [NSUIColor.red] lineDataSet.circleColors = [NSUIColor.red] //上で作ったデータをリストにappendで入れる linedata.append(lineDataSet) //データを返す。 return LineChartData(dataSets: linedata) } }
/*GetFarmData/swift*/ import UIKit class GetFarmData { struct FarmData : Codable{ var Date : [String] var Temp : [Double] } var DateArray:[String] = [] var TempArray:[Double] = [] func GetData() { let UrlString = "https://script.googleusercontent.com/macros/echo?user_content_key=Ay52NkEmsTwP9m_g-4Nv7bfyqPzORn1CtkPpDI45PJKbmJkTErIIrLunc4oeUQRCd5toyTRnpgETSjloFsDHd0HfqGkKwZ5dm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnLoHBjeqZZOS6uDdoVZbaErJG4ILXd2YeBoAJC8FsHjBLhCJb1CRC6P4G-VDNPWQFw&lib=Mt8YZ4DmL8BZYB77Ydcy6Qd3x1ejDTiej" //WebアプリのURL if let url = URL(string: UrlString){ URLSession.shared.dataTask(with: url) { data, response, error in if let data = data{ do{ let FarmInfo = try JSONDecoder().decode(FarmData.self, from: data) DispatchQueue.main.async { self.DateArray = FarmInfo.Date self.TempArray = FarmInfo.Temp } }catch let error{ print(error) print(data) } } }.resume() } // Do any additional setup after loading the view, typically from a nib. } }
試したこと
普通のDouble型配列の代入はできたのですが、JSONから引っ張ってきたデータを代入することができません。
DateArrayに関してはString型なので、エラーが出るのは当然なのですが、Double型の配列にして実行した時でも、最初に述べた"Thread 1: signal SIGABRT"のエラーが出てしまいます。
また、GetFarmData.swiftのDateArrayとTempArrayにわざわざ一度代入しなくてもできるような気がするのですが、どうなのでしょうか。
お手数ですが、ご回答いただけると幸いです。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Xcode 10.1
Swift4
回答1件
あなたの回答
tips
プレビュー