我正在制作一个基于平铺的冒险游戏,我正在尝试生成平铺地图。我整理了一些代码,将内陆瓷砖从可能的新瓷砖位置列表中删除。我有一种方法可以检测瓷砖是否是沿海的。

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 }

就这样。

09-11 13:02