我正在制作一个基于平铺的冒险游戏,我正在尝试生成平铺地图。我整理了一些代码,将内陆瓷砖从可能的新瓷砖位置列表中删除。我有一种方法可以检测瓷砖是否是沿海的。
for (index, tile) in landTiles.enumerate() {
let coastal = isCoastal(tile.y, x: tile.x)
if coastal {
coastTiles.append(tile)
} else {
print(landTiles.count)
print(index)
landTiles.removeAtIndex(index)
}
}
当我运行此代码时,会收到一条
error: index out of range
消息。我相信这是因为当我从地砖中删除一个项目时,索引会变得混乱。我该怎么解决? 最佳答案
枚举数组时,正在从数组中删除元素。
这是一种反模式。
你应该怎么做?
瓷砖类
首先,Tile
类应该有一个isCoastal
计算属性。像这样的东西
class Tile {
let x: Int
let y: Int
var isCoastal: Bool { /* your logic goes here */ }
init(x:Int, y:Int) {
self.x = x
self.y = y
}
}
过滤
现在给出一个数组
Tile
(s)var landTiles: [Tile] = ...
你可以提取那些
isCoastal true
let coastTiles = landTiles.filter { $0.isCoastal }
并用
isCoastal false
的数组覆盖原始数组。landTiles = landTiles.filter { !$0.isCoastal }
就这样。