swift中的多维数组对象bug?

时间:2014-12-01 23:31:11

标签: ios arrays swift multidimensional-array

我有一个多维(2D)项目数组(对象),我决定使用“自然”方式来创建它(因此,不是使用技巧将1D数组转换为2D,而是直接使用2D)。

项目有X&矩阵上的Y位置和项目也是随机类型。

除了所有物品的Y位置外,一切似乎都有效...... 由于Swift如何处理2D,我需要初始化2D数组,然后正确地影响每个项目的值。

我确实验证了我对这些项目产生的影响,它们有效。然后,当我在正确设置项目后验证该项目时,Y位置对于所有项目都是唯一的。

class Matrix {
    var nbCol: Int
    var nbRow: Int
    var items: [[Item]]

    init(nbCol: Int, nbRow: Int) {
        self.nbCol = nbCol
        self.nbRow = nbRow
        items = Array<Array<Item>>()
        //Initialize
        for col in 0..<Int(nbCol) {
            items.append(Array(count: nbRow, repeatedValue: Item()))
        }
        //Affect the correct values to each item
        createItems()
    }

    func createItems() {
        //Assign X, Y & type values to the item
        for x in 0..<Int(nbCol) {
            for y in 0..<Int(nbRow) {
                items[x][y].setItem(x, y: y, type: ItemType.random())
                println("Create for (\(x), \(y)): (\(items[x][y].x), \(items[x][y].y))")
            }
        }
        //Verify the values
        for x in 0..<Int(nbCol) {
            for y in 0..<Int(nbRow) {
                println("Check for (\(x), \(y)): (\(items[x][y].x), \(items[x][y].y))")
            }
        }
    }
}

而Item(部分)是:

class Item: Printable {
    var x: Int
    var y: Int
    var type: ItemType  //Enum

    func setItem(x: Int, y: Int, type: ItemType) {
        self.x = x
        self.y = y
        self.type = type
    }

}

输出(问题为红色):

Console output

正如您所看到的,在“设定值”期间,X&amp; Y是对的。但在检查时,只有X是正确的,Y是“卡住”。我做错了吗?

编辑:顺便说一下,所有商品的类型也相同。只有X是正确的,Y&amp;所有项目的类型都是“固定的”。

1 个答案:

答案 0 :(得分:1)

您的问题是repeatedValue:Item()仅评估一次,未评估count次。这意味着您在给定列的每一行中都有相同的项目,因此当您设置值时,您将覆盖前一个 - 这就是您在打印时获得最后一个值(2)的原因。

您需要使用循环来填充行而不是使用count / repeatedValue构造。

init(nbCol: Int, nbRow: Int) {
    self.nbCol = nbCol
    self.nbRow = nbRow
    items = Array<Array>()
    //Initialize
    for col in 0..<Int(nbCol) {

         var colArray=Array<Item>()

          for row in 0..<Int(nbRow) {
             colArray.append(Item())
          }

        items.append(colArray)
    }
    //Affect the correct values to each item
    createItems()
}