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

Swift中能否随机遍历选择并移除数组元素?索引越界问题求助

问题1解答

在Swift中完全可以实现循环遍历并随机选择移除数组元素,但必须保证每次操作时数组的索引合法性,尤其要注意数组长度动态变化时的索引范围。

问题2解答

你遇到的「Index out of range」错误,核心原因是传入buildShipYard的随机数范围和实际操作的locations数组长度不匹配,具体分析和修复方案如下:

错误根源

调用buildShipYard时,你用mersenne.nextInt(upperBound: base.locations.count)生成随机数,但buildShipYard内部操作的locations数组,其长度会随着元素移除逐渐减小,而你生成随机数时始终以base.locations.count为上限。当随机数大于当前locations数组的最大合法索引时,就会触发越界错误。

举个例子:

  1. 初始时base.locations.count = 5,locations数组长度也是5,第一次生成的随机数范围0-4,合法;
  2. 移除一个元素后,locations长度变为4,但base.locations.count未同步更新仍为5,第二次生成的随机数可能是4,而此时locations的最大索引是3,访问locations[4]直接报错。

修复方案

修改调用代码,让随机数的上限基于当前locations数组的实际长度,同时增加数组非空判断避免无效调用:

for location in playerBase!.locations {
    if location.tavernBuilding, !locations.isEmpty {
        buildShipYard(random: mersenne.nextInt(upperBound: locations.count))
    }
}

额外优化建议

  1. 简化元素移除逻辑:你已经有了随机生成的索引,无需再通过firstIndex(where:)查找,直接用该索引移除元素更高效,还能避免对象比较的潜在问题:
    // 替换原移除代码
    locations.remove(at: random)
    print(locations.count)
    
  2. 在buildShipYard开头增加数组非空判断,防止空数组访问:
    guard !locations.isEmpty else { return }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:17