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

SwiftUI Charts框架中AxisContent内用ForEach报错求助

SwiftUI Charts AxisContent 使用ForEach报错的解决方法

错误原因分析

  • 错误1:@AxisContentBuilder 不支持直接将ForEach作为构建块,因为ForEach本身未遵循AxisContent协议,无法被AxisContentBuilder解析。
  • 错误2:AxisMarks的values参数要求传入遵循Plottable协议的数据类型,你传入的UUID不符合要求,应使用实际的图表数值(即CustomOverlayValuesData中的value字段,Float默认遵循Plottable)。

修正后的代码

@AxisContentBuilder var axisContent: some AxisContent {
    AxisMarks(
        position: .leading,
        values: axisContentValues.map { $0.value }
    ) { axis in
        // 通过axis.value匹配对应的CustomOverlayValuesData,显示对应数值
        if let targetData = axisContentValues.first(where: { $0.value == axis.value as? Float }) {
            AxisValueLabel {
                Text("\(targetData.value)")
            }
        }
    }
}

struct CustomOverlayValuesData: Identifiable {
    var id = UUID()
    let value: Float
}

var axisContentValues: [CustomOverlayValuesData] {
    [
        CustomOverlayValuesData(value: 10),
        CustomOverlayValuesData(value: 15),
        CustomOverlayValuesData(value: 20),
        CustomOverlayValuesData(value: 25)
    ]
}

关键修改说明

  1. 移除ForEach,直接在AxisMarks的values参数中传入所有需要标记的数值数组(通过map提取value字段),AxisMarks会自动为每个值生成标记,无需手动遍历。
  2. 将values参数的输入从UUID改为实际的Float数值,满足Plottable协议要求。
  3. 在AxisMarks的内容闭包中,通过axis.value匹配对应的CustomOverlayValuesData,确保显示正确的数值文本。

若需构建不同样式的轴标记,可使用Group包裹多个AxisMarks实例,但统一样式的标记直接用AxisMarks处理数组更简洁。

内容的提问来源于stack exchange,提问作者Asif Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:35:57