【问题标题】:2D Array where every element is a class element二维数组,其中每个元素都是类元素
【发布时间】:2015-12-08 20:55:16
【问题描述】:

我正在使用以下方式创建一个二维数组,其中每个元素都是一个类元素

var Width: int = 10
var Heigth: int = 10

class ABC {
    var A: Int = 0
    var B: Int = 0
    var C: Int = 0
}

var MABC = [[ABC]] (count: Width, repeatedValue: [ABC](count:Heigth, repeatedValue: ABC()))

和下面的表达式来改变其中一个元素的值。

MABC[0][0].A = 1

但是当我这样做时,所有矩阵元素的属性 A 都从 0 更改为 1,不仅在元素 [0][0] 中。

怎么了?

谢谢

【问题讨论】:

  • 没有错。你用相同的参考值填充你的数组,所以数组中的所有项目都代表同一个类...

标签: arrays swift class


【解决方案1】:
var Width: Int = 10
var Heigth: Int = 10

class ABC {
    var A: Int = 0
    var B: Int = 0
    var C: Int = 0
}

var MABC = [[ABC]] (count: Width, repeatedValue: [ABC](count:Heigth, repeatedValue: ABC()))
MABC.forEach { (arr) -> () in
    dump(UnsafePointer<ABC>(arr))
}
/*
▿ UnsafePointer(0x7FF4C0C36C20)
- pointerValue: 140689182780448
▿ UnsafePointer(0x7FF4C0C36C20)
- pointerValue: 140689182780448
▿ UnsafePointer(0x7FF4C0C36C20)
- pointerValue: 140689182780448
.....
*/

检查数组中每个元素的地址。您确实将相同的引用传递给数组的每个元素...

使用值类型填充你的数组

var Width: Int = 10
var Heigth: Int = 10

struct ABC {
    var A: Int = 0
    var B: Int = 0
    var C: Int = 0
}

var MABC = [[ABC]] (count: Width, repeatedValue: [ABC](count:Heigth, repeatedValue: ABC()))
MABC[0][0].A = 1
dump(MABC)

....▿ 10 elements
  ▿ [0]: 10 elements
    ▿ [0]: ABC
      - A: 1
      - B: 0
      - C: 0
    ▿ [1]: ABC
      - A: 0
      - B: 0
      - C: 0
    ▿ [2]: ABC
      - A: 0
      - B: 0
      - C: 0
.......

【讨论】:

  • 对不起,我不知道如何解决这个问题。我有一个 10 x 10 元素的数组 MABC,每个元素都是 ABC 类型的元素。
  • 将 struct 用作​​ MABC 将帮助您在数组的每个元素中使用它的额外副本。或者您可以先创建一个空数组,然后循环添加 MABC 类的新实例。
猜你喜欢
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多