【问题标题】:Multidimensional array of objects bug in swift?swift中的多维对象数组错误?
【发布时间】:2014-12-01 23:31:10
【问题描述】:

我有一个多维 (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))")
            }
        }
    }
}

而项目(它的一部分)是:

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
    }

}

以及输出(问题为红色):

如您所见,在“设置值”期间,X 和 Y 是正确的。但在检查时,只有 X 是正确的,而 Y 是“卡住”的。我是不是做错了什么?

EDIT :顺便说一句,所有项目也具有相同的类型。只有 X 是正确的,Y 和类型对于所有项目都是“固定的”。

【问题讨论】:

标签: ios arrays swift multidimensional-array


【解决方案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()
}

【讨论】:

  • 哦,我明白这个问题了!但是我应该如何对 swift 中的行进行循环?我试着像任何人在 C/C++ 中那样做,但是在 Swift 中,你不能创建一个具有 12 个固定行的数组。而且我不能在 repeatedValue 中使用 nil 代替 Item()
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 2014-07-25
  • 2019-08-03
  • 2018-09-10
  • 2020-03-14
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多