Swift Charts框架中ForEach引发的'some'类型推断错误求助
问题解决:Swift Charts中ForEach引发的类型推断错误
错误根源
你遇到的错误核心原因有两点:
- 错误用@State存储Chart视图:
Chart的返回类型是some View(不透明类型),Swift无法将其推断为@State的泛型参数类型,因此抛出“inferred type 'State', involving the 'some' return type”错误。 - @State初始化包含副作用逻辑:@State设计目的是存储视图状态值(如字符串、数字、数据模型),而非View实例;且你在@State初始化闭包里执行的数组转换属于副作用操作,不符合@State的使用规范。
修复步骤与代码示例
1. 修正数据模型的Identifiable实现
原PelletArr的id是固定值,会导致ForEach无法正确识别不同数据项,改为用日期字符串作为唯一标识:
struct PelletArr: Identifiable { var pelletdata: [String] // 用日期字符串作为唯一id,匹配你原ForEach的需求 var id: String { pelletdata[0] } }
2. 重构视图代码:移除@State存储Chart,直接在body中构建
将数据转换逻辑移到计算属性中,避免在视图初始化里做副作用操作:
struct ContentView: View { // 替换为你的实际数据存储实例类型 let pelletstor: PelletStorage // 计算属性:将原始二维数组转换为PelletArr数组 private var pelletArrList: [PelletArr] { pelletstor.stor.map { PelletArr(pelletdata: $0) } } var body: some View { // 直接在body里构建Chart,无需用@State存储 Chart { ForEach(pelletArrList) { pelletd in LineMark( x: .value("Date", DateString().dateNumber(dateStr: pelletd.pelletdata[0])), y: .value("Pellet Count", pelletd.pelletdata.count), series: .value("Axolotl", "A") ) .foregroundStyle(.green) } RuleMark(y: .value("Fixed", 10)) } } }
3. 可选优化:简化视图代码
把日期解析、pellet计数逻辑封装到数据模型中,让视图代码更简洁:
struct PelletArr: Identifiable { var pelletdata: [String] var id: String { pelletdata[0] } // 封装日期解析逻辑 var parsedDateNumber: Int { DateString().dateNumber(dateStr: pelletdata[0]) } // 封装pellet计数逻辑 var pelletCount: Int { pelletdata.count } } // 视图中简化LineMark代码 LineMark( x: .value("Date", pelletd.parsedDateNumber), y: .value("Pellet Count", pelletd.pelletCount), series: .value("Axolotl", "A") )
内容的提问来源于stack exchange,提问作者Missing User
相关产品推荐
相关产品推荐

