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

对比两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:37:15