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) ] }
关键修改说明
- 移除
ForEach,直接在AxisMarks的values参数中传入所有需要标记的数值数组(通过map提取value字段),AxisMarks会自动为每个值生成标记,无需手动遍历。 - 将
values参数的输入从UUID改为实际的Float数值,满足Plottable协议要求。 - 在
AxisMarks的内容闭包中,通过axis.value匹配对应的CustomOverlayValuesData,确保显示正确的数值文本。
若需构建不同样式的轴标记,可使用Group包裹多个AxisMarks实例,但统一样式的标记直接用AxisMarks处理数组更简洁。
内容的提问来源于stack exchange,提问作者Asif Raza
相关产品推荐
相关产品推荐

