Swift中能否随机遍历选择并移除数组元素?索引越界问题求助
问题1解答
在Swift中完全可以实现循环遍历并随机选择移除数组元素,但必须保证每次操作时数组的索引合法性,尤其要注意数组长度动态变化时的索引范围。
问题2解答
你遇到的「Index out of range」错误,核心原因是传入buildShipYard的随机数范围和实际操作的locations数组长度不匹配,具体分析和修复方案如下:
错误根源
调用buildShipYard时,你用mersenne.nextInt(upperBound: base.locations.count)生成随机数,但buildShipYard内部操作的locations数组,其长度会随着元素移除逐渐减小,而你生成随机数时始终以base.locations.count为上限。当随机数大于当前locations数组的最大合法索引时,就会触发越界错误。
举个例子:
- 初始时
base.locations.count = 5,locations数组长度也是5,第一次生成的随机数范围0-4,合法; - 移除一个元素后,
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)) } }
额外优化建议
- 简化元素移除逻辑:你已经有了随机生成的索引,无需再通过
firstIndex(where:)查找,直接用该索引移除元素更高效,还能避免对象比较的潜在问题:// 替换原移除代码 locations.remove(at: random) print(locations.count) - 在
buildShipYard开头增加数组非空判断,防止空数组访问:guard !locations.isEmpty else { return }
内容的提问来源于stack exchange,提问作者quickj
相关产品推荐
相关产品推荐

