2017-03-07 16 views
0

Firebaseのデータを日々取得しているアプリケーションがあり、iOSチャートを使用して毎日のデータを別のチャートに表示しようとしていますしかし、 '致命的なエラー:インデックスが範囲外です'というエラーでクラッシュします。以下は私のコードです:Swift - iOSチャート - 1つのViewControllerで2つのデータセットを使用する2つのLineChartビュー

func setChart(dataPoints: [String], values: [Double]) { 

    var dataEntries: [ChartDataEntry] = [] 

    for i in 0..<dataPoints.count { 
     let dataEntry = ChartDataEntry(value: values[i], xIndex: i) 
     dataEntries.append(dataEntry) 
    } 





    let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Units Sold") 
    let lineChartData = LineChartData(xVals: dataPoints, dataSet: lineChartDataSet) 
    firstDayChart.data = lineChartData 

} 

func setChart2(dataPoints: [String], values: [Double]) { 

    var dataEntries: [ChartDataEntry] = [] 

    for i in 0..<dataPoints.count { 
     let dataEntry = ChartDataEntry(value: values[i], xIndex: i) 
     dataEntries.append(dataEntry) 
    } 







    let lineChartDataSet = LineChartDataSet(yVals: dataEntries, label: "Units Sold") 
    let lineChartData = LineChartData(xVals: dataPoints, dataSet: lineChartDataSet) 
    secondDayChart.data = lineChartData 

} 

// BUTTON

@IBAction func getResults(sender: UIButton) { 
    let doubleArray = BGdataOutsideDay1.map { Double($0)!} 
    // print(doubleArray) 
    // var newArray:[Double] = [] 


    self.doublesArrayDay1 = doubleArray 

    if doublesArrayDay1.count != 0 { 
    let bgAvg = doubleArray.reduce(0, combine: +)/Double(doubleArray.count) 
    let highest = doubleArray.maxElement() 
    let lowest = doubleArray.minElement() 
    self.bgHighestDay1 = String(format: "%.1f", highest!) 
    self.bgAvgDay1 = String(format: "%.1f", bgAvg) 
    self.bgLowestDay1 = String(format: "%.1f", lowest!) 
    self.firstDayHighest.text = self.bgHighestDay1! + " " + "\(self.units!)" 
    self.firstDayAvg.text = self.bgAvgDay1! + " " + "\(self.units!)" 
    self.firstDayLowest.text = self.bgLowestDay1! + " " + "\(self.units!)" 
    } else { 
     self.firstDayHighest.text = "0" + " " + "\(self.units!)" 
     self.firstDayAvg.text = "0" + " " + "\(self.units!)" 
     self.firstDayLowest.text = "0" + " " + "\(self.units!)" 

    } 
    let doubleArray2 = BGdataOutsideDay2.map { Double($0)!} 
    // print(doubleArray) 
    // var newArray:[Double] = [] 


    self.doublesArrayDay2 = doubleArray 

    if doublesArrayDay2.count != 0 { 
     let bgAvg2 = doubleArray2.reduce(0, combine: +)/Double(doubleArray.count) 
     let highest2 = doubleArray2.maxElement() 
     let lowest2 = doubleArray2.minElement() 
     self.bgHighestDay2 = String(format: "%.1f", highest2!) 
     self.bgAvgDay2 = String(format: "%.1f", bgAvg2) 
     self.bgLowestDay2 = String(format: "%.1f", lowest2!) 
     self.secondDayHighest.text = self.bgHighestDay2! + " " + "\(self.units!)" 
     self.secondDayAvg.text = self.bgAvgDay2! + " " + "\(self.units!)" 
     self.secondDayLowest.text = self.bgLowestDay2! + " " + "\(self.units!)" 
    } else { 
     self.secondDayHighest.text = "0" + " " + "\(self.units!)" 
     self.secondDayAvg.text = "0" + " " + "\(self.units!)" 
     self.secondDayLowest.text = "0" + " " + "\(self.units!)" 
     setChart(DateOutSideDay1, values: doublesArrayDay1) 
    setChart(DateOutSideDay2, values: doublesArrayDay2) 

    } 

任意の助けいただければ幸いです!前もって感謝します! :)

+0

'values'配列に' dataPoints'配列よりも少ない項目があるようです。これはあなたが得ているエラーを説明するでしょう。 – Laffen

+0

はい、私は理由を知っていますが、私はそれを働かせたいです:) – Deyan

+0

どのアレイがこの問題を引き起こしているかチェックしましたか? –

答えて

0

まず、データポイントと別の値セットがあるのは変だと思いますが、同じサイズではありませんか?これらのセットは、値がデータポイントを表すので、同じサイズでなければなりません。

とにかく..

あなたがvalues配列内のそのインデックスで使用可能な値はありませんとき、私はそれを設定し、使用するデフォルト値を定義することができlet dataEntry = ChartDataEntry(value: i < values.count ? values[i] : 0, xIndex: i)

let dataEntry = ChartDataEntry(value: values[i], xIndex: i)を置き換えることによって、この問題を解決することができます0

+0

ありがとうございます! :) – Deyan

関連する問題