我有一个多维(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
}
}
输出(问题为红色):
正如您所看到的,在“设定值”期间,X&amp; Y是对的。但在检查时,只有X是正确的,Y是“卡住”。我做错了吗?
编辑:顺便说一下,所有商品的类型也相同。只有X是正确的,Y&amp;所有项目的类型都是“固定的”。
答案 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()
}