我有一个饼状图,显示添加到其中的数据它看起来像这样:
class HomeViewController: UIViewController {
var pieChart = PieChartView()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pieChart.delegate = self
self.setChart()
}
func setChart() {
var entries: [ChartDataEntry] = []
for entry in 0..<(self.cellArr.count) {
if self.cellArr.count > 0 {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
}
updateSorting(values: entries)
}
func updateSorting(values: [ChartDataEntry]){
let dataSet = PieChartDataSet(entries: values, label: "")
let data = PieChartData(dataSets: [dataSet])
dataSet.colors = ChartColorTemplates.colorful()
pieChart.data = data
pieChart.notifyDataSetChanged()
}
}
问题出在entries变量中,它位于setChart函数中。我需要在函数外使用它,但如果我把它放在类中-
class HomeViewController: UIViewController {
var pieChart = PieChartView()
var entries: [ChartDataEntry] = [] // <------------ !!!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pieChart.delegate = self
self.setChart()
}
}
然后图表将开始显示额外的值
一个说明性示例:
在这里输入图像描述输入图片描述
在第一个屏幕截图中,条目在一个函数中,在第二个屏幕截图中,条目已经在函数后面了
我尝试设置断点并查看for循环,但我仍然不明白为什么每次迭代数组都会将旧数据添加到新数据中
由于您正在从viewWillAppear
调用setChart
,因此您将在数组中添加许多项(如果视图在单个会话中出现/消失)。您需要适当地清除变量,或者只是完全覆盖它们。
不相关,但是你可以大大简化这个for循环代码:
开始:
func setChart1() {
var entries: [ChartDataEntry] = []
for entry in 0..<(self.cellArr.count) {
if self.cellArr.count > 0 {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
}
updateSorting(values: entries)
}
删除无用的if
语句:
func setChart2() {
var entries: [ChartDataEntry] = []
for entry in 0..<(self.cellArr.count) {
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}
用简单的Array.indices
替换手动构建的索引范围:
func setChart3() {
var entries: [ChartDataEntry] = []
for entry in self.cellArr.indices { // "entry" is a total misnomer. It's not an entry, it's an index that can be used to get an entry
let dataEntry = PieChartDataEntry(value: Double(self.cellArr[entry].amount), label: String(self.cellArr[entry].type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}
意识到你甚至不需要索引,你实际上只关心值本身:
func setChart4() {
var entries: [ChartDataEntry] = []
for entry in self.cellArr {
let dataEntry = PieChartDataEntry(value: Double(entry.amount), label: String(entry.type))
entries.append(dataEntry)
}
updateSorting(values: entries)
}
内联局部变量(它的名字没有添加有用的信息):
func setChart5() {
var entries: [ChartDataEntry] = []
for entry in self.cellArr {
entries.append(PieChartDataEntry(value: Double(entry.amount), label: String(entry.type)))
}
updateSorting(values: entries)
}
注意这只是一个map
操作:
func setChart6() {
var entries: [ChartDataEntry] = self.cellArr.map { entry in
PieChartDataEntry(value: Double(entry.amount), label: String(entry.type)))
}
updateSorting(values: entries)
}
entries
现在可以是不可变的,并且可以使用类型推断:
func setChart7() {
let entries = self.cellArr.map { PieChartDataEntry(value: Double($0.amount), label: String($0.type))) }
updateSorting(values: entries)
}
我将entries
的数组放入一个类中,并在setChart7
函数中清除它
class HomeViewController: UIViewController {
var pieChart = PieChartView()
var entries: [ChartDataEntry] = []
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setChart()
}
func setChart7() {
entries.removeAll()
let entries = self.cellArr.map { PieChartDataEntry(value: Double($0.amount), label: String($0.type))) }
updateSorting(values: entries)
}
}