Charts: рдмрд░рдЪрд╛рд░реНрдЯ рдПрдирд┐рдореЗрд╢рди рдЯрд╛рдЗрдк рдИрдЬрд╝реАрдЗрдирдмреИрдХ рдХреНрд░реИрд╢

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдорд╛рд░реНрдЪ 2018  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: danielgindi/Charts

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ
```
рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рд╡реНрдпреВ {

private class BarChartFormatter: NSObject,IAxisValueFormatter {

    var values : [String]
    required init (values : [String]) {
        self.values = values
        super.init()
    }


    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        return values[Int(value)]
    }
}

func setChartValues (xAxisValues : [String] , values : [Double],label : String) {

    var barChartDataEntries = [BarChartDataEntry]()

    for i in 0..<values.count {
        let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
        barChartDataEntries.append(dataEntry)
    }
    let chartDataSet = BarChartDataSet(values: barChartDataEntries, label: label)
    chartDataSet.colors = ChartColorTemplates.colorful()
    let chartData = BarChartData(dataSet: chartDataSet)

    let formatter = BarChartFormatter(values: xAxisValues)
    let xAxis = XAxis()
    xAxis.valueFormatter = formatter
    self.xAxis.valueFormatter = xAxis.valueFormatter
    self.xAxis.labelPosition = .bottom

    self.data = chartData
   // self.data?.notifyDataChanged()
   // self.notifyDataSetChanged()

    self.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInBack) // Cause  crash

}

}
```

рдФрд░ рдРрдк рдпрд╣рд╛рдВ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

for j in 0 ..< Int(ceil(Double(dataSet.entryCount) * animator.phaseX)) // Crash here { guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }

рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐: рдЕрдкрд░рдмрд╛рдЙрдВрдб <рд▓реЛрдЕрд░рдмрд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рд░реЗрдВрдЬ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛

(lldb) dataSet.entryCount . рдХреЗ рд▓рд┐рдП
12

(рдПрд▓рдПрд▓рдбреАрдмреА) рдПрдирд┐рдореЗрдЯрд░.рдлреЗрдЬX
-0.085005447941268492

рдХреГрдкрдпрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВ

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрдИ рдмрдбрд╝рд╛ рдХрд╛рд░реНрдп рд╣реЛ рдЬрд┐рд╕рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ
рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реБрдЖ

рд▓рд╛ рд╕рдорд╛рдзрд╛рди

        DispatchQueue.main.async(execute: {() -> Void in
       self.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInBack) 
        })

рдореБрдЭреЗ рднреА рдРрд╕рд╛ рд╣реА рд▓рдЧрддрд╛ рд╣реИ,
for j in 0 ..< Int(ceil(Double(dataSet.entryCount) * animator.phaseX))
рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛рд╡
for j in stride(from: 0, to: Int(ceil(Double(dataSet.entryCount) * animator.phaseX)), by: 1)

@PrashantKT рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ @txoan рдиреЗ рдЬреЛ рд╕реНрдирд┐рдкреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЛрдИ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХреЗ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдирдИ рдмрдЧ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред @jjatie @liuxuan30

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕