获取数组中最大y值对应x值时遇越界错误,求替代方案
解决方案
你的代码出现越界错误,核心原因是直接操作数组索引的方式存在风险——即便你用if let处理了空数组场景,索引操作本身也不如直接操作元素稳妥。以下是几种更安全的实现方式:
方式一:直接获取最大y值对应的元素
利用数组原生的max(by:)方法直接定位y值最大的DataPoint元素,完全跳过索引操作,从根源避免越界问题:
let dataPoints: [DataPoint] = await calculateDataPoints() if let maxYPoint = dataPoints.max(by: { $0.y < $1.y }) { return maxYPoint.x } // 数组为空时的处理逻辑,比如返回默认值或抛出错误
这个方法会返回数组中第一个出现的y值最大元素,同时自动处理空数组(此时max(by:)返回nil)。
方式二:先取最大y值,再匹配对应x值
如果需要处理多个元素拥有相同最大y值的场景(比如获取所有对应x值,或明确取第一个/最后一个),可以先提取最大y值,再过滤数组:
let dataPoints: [DataPoint] = await calculateDataPoints() guard let maxY = dataPoints.map(\.y).max() else { // 空数组处理逻辑,返回默认值或其他操作 return 0.0 } // 筛选出所有y值等于最大值的元素 let maxYPoints = dataPoints.filter { $0.y == maxY } // 按需取第一个/最后一个元素的x值 return maxYPoints.first?.x ?? 0.0
额外隐患提示
你的DataPoint结构体中id的计算逻辑存在运行时崩溃风险:当y为0时,x/y会触发除以零错误。建议修改id生成方式,比如:
var id: String { "\(x)-\(y)" }
内容的提问来源于stack exchange,提问作者koen
相关产品推荐
相关产品推荐

