比较两个核心数据实体的图表有时会崩溃,并显示“swift/ContigeousArrayBuffer.swift:600:致命错误:索引超出范围”

问题描述 投票:0回答:1

我尝试在这里使用图表比较两个核心数据实体。我进入一个俱乐部的详细视图,其中显示了该俱乐部的击球图表。当我从选择器中选择另一个球杆时,它应该以不同的颜色在图表上显示球杆的击球。有时它可以工作,但其他时候(似乎是随机的)它会使应用程序崩溃,并且我收到一条错误消息,显示

swift/ContiguousArrayBuffer.swift:600: Fatal error: Index out of range

struct ClubCompareChartView: View {
    var club: Club
    var compareClub: Club?
    var body: some View {
        Chart(0..<(club.strokesList.count), id: \.self) { nr in
            PointMark(
                x: .value("X value", nr),
                y: .value("Y value", club.strokesList[nr])
            )
            
            if compareClub != nil{
                PointMark(
                    x: .value("X value", nr),
                    y: .value("Y value", compareClub!.strokesList[nr])
                ).foregroundStyle(.blue)
            }
        }    
    }
}
swiftui core-data
1个回答
0
投票

有很多方法可以避免索引崩溃。

您可以尝试使用

indices
而不是范围 and 测试超出范围的索引,如示例代码所示。

您也可以使用

enumerated()
来实现您想要的。

struct ClubCompareChartView: View {
    var club: Club
    var compareClub: Club?
    
    var body: some View {
        Chart(club.strokesList.indices, id: \.self) { nr in  // <-- here
            PointMark(
                x: .value("X value", nr),
                y: .value("Y value", club.strokesList[nr])
            )

            if compareClub != nil && nr < compareClub!.strokesList.count {  // <-- here
                PointMark(
                    x: .value("X value", nr),
                    y: .value("Y value", compareClub!.strokesList[nr])
                ).foregroundStyle(.red)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.