2015-12-08 174 views
0

我使用下面的方法来创建一个二维阵列,其中每个元素是一个类元素2D阵列,其中每个元素是一个类元素

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 

但是当我做到这一点,所有matriz元素的属性A从0变为1时,不仅在元件[0] [0]。

怎么了?

感谢

+0

这无可厚非。你用相同的参考值填充你的数组,所以数组中的所有项表示相同的类... – user3441734

回答

0
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 
....... 
+0

我很抱歉,但我不知道如何解决这个问题。我有一个10×10元素的数组MABC,每个元素都是ABC类型的元素。 – moranchoj

+0

使用struct作为MABC将帮助您在数组的每个元素中使用它的额外副本。或者您可以先创建一个空数组,然后在一个循环中添加MABC类的新实例。 – user3441734

+0

谢谢我会尝试 – moranchoj

相关问题