Swift二维数组初始化与对象

时间:2016-02-15 13:58:38

标签: ios arrays swift swift2

我正在尝试使用每个单元格中的对象初始化2D数组。 我开始上课,

class cell {
    var up = 1
    var down = 1
    var right = 1
    var left = 1
}

然后初始化我的数组:

let row = Array<cell!>(count: 10, repeatedValue: cell())
let myArray = Array(count: 10, repeatedValue: row)

现在工作正常......直到我改变其中一个对象的属性。

myArray[0][0].left = 0

然后,Array中的所有对象都将其“left”属性设置为0。

如何在数组中创建彼此独立的对象? (不使用for循环单独附加每个项目)

4 个答案:

答案 0 :(得分:3)

这不适用Cell作为class,因为这是一种引用类型,因此数组中的每个单元格都是对同一单元格的引用。如果可以,请将Cell更改为struct而不是class。作为值类型,每个单元格都是唯一的副本。

如果Cell必须是class,您可以使用嵌套的myArray创建map(技术上仍然是循环):

let myArray:[[Cell!]] = (1...10).map { _ in (1...10).map { _ in Cell() } }

注意,您应该使用以classstruct名称的大写字母开头的名称,这就是我将cell更改为Cell的原因。

答案 1 :(得分:1)

因为struct是一个类而类是引用类型。因此,第一行创建一个对同一单元格有10个引用的行。第二行创建10个唯一行(数组为var array = [[Cell]]() for _ in 0 ..< 10 { var row = [Cell]() for _ in 0 ..< 10 { row.append(Cell()) } array.append(row) } 因此值类型)但所有唯一行都有10个对同一单元格的引用。

有几种方法可以解决这个问题。您可以确保创建100个唯一单元格:

Cell

或者,如果Cell与您的示例一样简单并且您不需要继承,那么您可以考虑将struct Cell { var up = 1 var down = 1 var right = 1 var left = 1 } 作为结构,这可能是最好的选择。

var array = [[Cell]](count: 10, repeatedValue: [Cell](count: 10, repeatedValue: Cell())) 

在这种情况下,您可以按照预期的方式初始化数组。

Glassfish 3.1.2.2

答案 2 :(得分:0)

你在做什么赢了工作。如果您尝试创建一个数组并填充RepeatValue并且重复的值是一个对象,则该数组包含对同一对象的多个引用。 (对象是&#34;引用类型&#34;。当添加到容器时,添加的是对对象的引用,而不是副本。)

您需要为外部数组中的每个条目创建一个新对象:

(编辑创建一个String对象数组,因为我无法访问OP的cell类)

typealias rowArray = [String!]
var myArray = [rowArray]()
for i in 1...10
{
  myArray.append(rowArray(count: 10, repeatedValue: "Foo"))
}

请注意,您的内部数组将面临同样的问题。您没有一组唯一的单元格对象 - 您有一个包含对单个单元格对象的多个引用的数组。

答案 3 :(得分:0)

您的班级cell有效,是一种参考类型。那是什么意思 ? 那么,关于这个主题的Apple's explanation就足够了:

  

Swift中的类型分为两类:第一类是“值类型”,   其中每个实例都保留其数据的唯一副本,通常是定义的   作为结构,枚举或元组。第二,“参考类型”,在哪里   实例共享数据的单个副本,通常是类型   定义为一个类。在这篇文章中,我们探讨价值和价值的优点   引用类型,以及如何在它们之间进行选择。

通过将cell声明为class,这是一种引用类型。

Refence类型

// let's create an object
let cell1 = Cell()
// now we add a reference to this object
let cell2 = cell1

// now we change the top of cell1
cell1.up = 10

NSLog("\(cell2.up)")  
// -> outputs : 10
// Since cell1 and cell2 represents the same object, 
// you can't modify cell1 without modifying ce22.

如果您将cell声明为struct而不是class,会发生什么?它变成了一个值类型:

值类型

// let's create an object
let cell1 = Cell()

// now we create a new object, cell2, with the value initialized 
// with cell1's value. It's a copie, not a reference
let cell2 = cell1

// now we change the top of cell1
cell1.up = 10

NSLog("\(cell2.up)")  
// -> outputs : 0
// Here cell1 and cell2 are totally different objects