You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:45:33