Swift基于Charts框架实现动态多折线图的技术问询
动态适配任意数量折线的Charts改造方案
改造后的完整函数代码
func newLineChartValue(carbonLineChartValue: [LineChartValue]) { // 清空原有数据,避免重复叠加 zoneNames.removeAll() allValueArray.removeAll() colors.removeAll() // 遍历传入的折线数据,收集名称、数值数组和颜色 for value in carbonLineChartValue { zoneNames.append(value.Zone_name ?? "") if let values = value.value_array { allValueArray.append(values) } colors.append(value.zone_color ?? "#000000") } // 空数据保护,避免数组越界 guard !allValueArray.isEmpty else { lineChartView.data = nil return } // 存储所有折线数据集 var dataSets = [LineChartDataSet]() // 获取X轴标签(默认取第一条折线的标签,假设所有折线时间维度一致) let firstLineValues = allValueArray[0] let timeLbl = firstLineValues.compactMap { $0.label } // 遍历生成每条折线的数据集 for (index, values) in allValueArray.enumerated() { // 生成当前折线的坐标点数组 let entries = values.enumerated().map { entryIndex, value in ChartDataEntry(x: Double(entryIndex), y: value.value ?? 0) } // 创建折线数据集并配置样式 let dataSet = LineChartDataSet(entries: entries, label: zoneNames[index]) dataSet.axisDependency = .left dataSet.mode = .cubicBezier let lineColor = UIColor(hex: colors[index]) ?? .black dataSet.setColor(lineColor) dataSet.fillColor = lineColor dataSet.setCircleColor(lineColor) dataSet.lineWidth = 4 dataSet.circleRadius = 4 dataSet.fillAlpha = 65/255 dataSet.drawCircleHoleEnabled = false dataSets.append(dataSet) } // 组装图表数据并配置X轴 let lineChartData = LineChartData(dataSets: dataSets) lineChartData.setDrawValues(false) lineChartView.xAxis.labelPosition = .bottom lineChartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: { index, _ in guard Int(index) < timeLbl.count else { return "" } return timeLbl[Int(index)] }) lineChartView.data = lineChartData }
关键改动说明
- 移除固定变量,改用动态数组:删除了
lineChartEntry1/2/3这类固定变量,用dataSets数组存储所有折线数据集,支持任意数量的折线。 - 循环复用样式逻辑:通过
enumerated()遍历所有折线数据,统一生成坐标点和配置折线样式,避免重复代码。 - 安全处理可选值:将强制解包(
!)替换为默认值或可选绑定,避免数据异常时崩溃。 - 空数据边界处理:添加空数组判断,无数据时清空图表,防止数组越界错误。
- X轴标签容错:在X轴格式化器中添加越界判断,避免索引超出标签数组长度的问题。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

