我正在制作基于拼图的冒险游戏,并且我正在尝试生成拼贴地图。我整理了一些代码,从可能的新磁贴位置列表中删除内陆磁贴。我有一种方法可以检测瓷砖是否是沿海的。
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
条消息。我相信这是因为当我从landTiles中删除一个项目时,索引会变得混乱。我怎么能解决这个问题?
答案 0 :(得分:3)
在枚举数组时,您将从数组中删除元素。 这是一种反模式。
你应该做什么呢?
首先,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 }
那就是它。