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

Swift多维结构体数组替换子数组元素时报索引越界错误如何解决

报错根因
  • 类型不匹配:mainArray定义为[[Main]](存储Main数组的二维数组),代码直接将Main类型的data作为元素插入,导致mainArray内部结构不符合预期,后续访问子数组元素时必然触发越界。
  • 值类型拷贝问题:Swift数组为值类型,for var subArray in mainArray遍历拿到的是子数组的拷贝,修改拷贝内容不会同步到原数组,且如果遍历到的子数组为空,访问subArray[0]直接触发越界。
  • 硬编码索引风险:内层遍历所有元素时固定修改subArray[0],没有判断子数组是否存在第一个元素,为空时直接越界。
修复方案

如果你需要给mainArray添加一个包含data的子数组,再将子数组内所有元素的city修改为SB,可参考如下代码:

struct Main {
  var city: String
  var pop: Int
  var color: String
}

class Home {
    
var mainArray = [[Main]]()

func update() {
    let data = Main(city: "SF", pop: 2, color: "orange")
    // 匹配二维数组类型要求,插入子数组
    mainArray.append([data])
    
    // 用索引遍历原数组,避免值类型拷贝不生效的问题
    for subArrayIndex in mainArray.indices {
        for elementIndex in mainArray[subArrayIndex].indices {
            mainArray[subArrayIndex][elementIndex].city = "SB"
        }
    }
  }
}

修复点说明

  • 把mainArray.append(data)改为mainArray.append([data]),匹配[[Main]]的类型要求,保证子数组结构合法。
  • 改为通过索引遍历原数组,直接修改原数组元素,解决值类型拷贝修改不生效的问题。
  • 用indices获取数组的合法索引范围,完全避免越界访问风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:03