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

Swift开发货币转换器时从JSON数组取值报索引越界错误如何修复

崩溃原因
  • 核心错误是数组下标越界:你当前pickerSelection1的取值范围是0..<api.currencyCode1.count,但用这个值访问api.txt数组时,下标超出了api.txt的有效索引区间,常见触发场景有两种:
    1. api.currencyCode1和api.txt两个数组的长度不一致,api.txt的元素数量更少
    2. 货币数据是异步加载的,初始渲染时api.txt还是空数组,此时默认值pickerSelection1 = 0会直接触发越界
修复方案
  1. 优先优化数据结构:不要用两个独立数组分别存储货币代码和全称,建议封装统一结构体避免数据不一致:
// 定义货币信息结构体
struct Currency: Identifiable {
    let id = UUID()
    let code: String
    let fullName: String
}
// API层统一输出[Currency]类型的货币列表即可,不需要拆分两个数组
  1. 给数组访问加安全校验,避免非法下标直接触发崩溃:
// 替换原有错误的Text行
if pickerSelection1 < api.txt.count {
    Text(api.txt[pickerSelection1])
} else {
    Text("加载中")
}
  1. 适配异步加载场景:调整选择器状态为可选,数据加载完成前不进行越界访问:
// 修改状态定义
@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])
}
  1. 移除Picker上的.id(UUID())修饰:这个写法会导致每次视图刷新时Picker被完全重建,没有实际意义反而会影响性能。

内容的提问来源于stack exchange,提问作者user17298288

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:00:00