对比两个Core Data实体的Chart偶发崩溃:数组索引越界错误
解决SwiftUI Chart对比Core Data实体时的索引越界崩溃
崩溃的核心原因是:你遍历的范围基于club.strokesList.count,但当compareClub的strokesList元素数量少于club的时,循环到超过compareClub.strokesList.count的索引nr,访问compareClub!.strokesList[nr]就会触发索引越界错误。加上Core Data数据可能在视图渲染时后台更新,导致数组长度随机变化,所以出现随机崩溃现象。
修复方案
- 计算两个数组的最小长度,只遍历到该范围内的索引,避免访问不存在的元素
- 用可选绑定替代强制解包,同时在访问数组前做索引有效性校验
修改后的完整代码
struct ClubCompareChartView: View { var club: Club var compareClub: Club? var body: some View { // 取两个列表的最小长度,确保遍历范围不会越界 let maxDisplayCount = min(club.strokesList.count, compareClub?.strokesList.count ?? 0) Chart(0..<maxDisplayCount, id: \.self) { nr in // 当前俱乐部的数据点 PointMark( x: .value("击球次数", nr), y: .value("击球数值", club.strokesList[nr]) ) // 安全处理对比俱乐部的数据 if let compareClub = compareClub, nr < compareClub.strokesList.count { PointMark( x: .value("击球次数", nr), y: .value("击球数值", compareClub.strokesList[nr]) ).foregroundStyle(.blue) } } } }
额外建议
- 如果Core Data数据可能在视图渲染时更新,建议使用
@FetchRequest或数据监听机制,确保视图使用的是稳定的最新数据,避免数组长度突变引发崩溃 - 视图
body中尽量避免强制解包可选值,优先用可选绑定或默认值提升代码稳定性
内容的提问来源于stack exchange,提问作者jhbetts
相关产品推荐
相关产品推荐

