Swift开发货币转换器时从JSON数组取值报索引越界错误如何修复
崩溃原因
- 核心错误是数组下标越界:你当前
pickerSelection1的取值范围是0..<api.currencyCode1.count,但用这个值访问api.txt数组时,下标超出了api.txt的有效索引区间,常见触发场景有两种:api.currencyCode1和api.txt两个数组的长度不一致,api.txt的元素数量更少- 货币数据是异步加载的,初始渲染时
api.txt还是空数组,此时默认值pickerSelection1 = 0会直接触发越界
修复方案
- 优先优化数据结构:不要用两个独立数组分别存储货币代码和全称,建议封装统一结构体避免数据不一致:
// 定义货币信息结构体 struct Currency: Identifiable { let id = UUID() let code: String let fullName: String } // API层统一输出[Currency]类型的货币列表即可,不需要拆分两个数组
- 给数组访问加安全校验,避免非法下标直接触发崩溃:
// 替换原有错误的Text行 if pickerSelection1 < api.txt.count { Text(api.txt[pickerSelection1]) } else { Text("加载中") }
- 适配异步加载场景:调整选择器状态为可选,数据加载完成前不进行越界访问:
// 修改状态定义 @State var pickerSelection1: Int? // Picker部分适配可选类型 Picker("", selection: $pickerSelection1) { ForEach(0..<self.api.currencyCode1.count, id: \.self) { index in Text(api.currencyCode1[index]) .tag(index as Int?) } } .labelsHidden() .padding() // 文本展示部分做非空和下标校验 if let selectedIndex = pickerSelection1, selectedIndex < api.txt.count { Text(api.txt[selectedIndex]) }
- 移除
Picker上的.id(UUID())修饰:这个写法会导致每次视图刷新时Picker被完全重建,没有实际意义反而会影响性能。
内容的提问来源于stack exchange,提问作者user17298288
相关产品推荐
相关产品推荐

