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
相关产品推荐
相关产品推荐

