Swift枚举超出范围

时间:2016-05-18 23:20:39

标签: swift enums

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

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中删除一个项目时,索引会变得混乱。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:3)

在枚举数组时,您将从数组中删除元素。 这是一种反模式。

你应该做什么呢?

Tile类

首先,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 }

那就是它。