我正在尝试使用每个单元格中的对象初始化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循环单独附加每个项目)
答案 0 :(得分:3)
这不适用Cell
作为class
,因为这是一种引用类型,因此数组中的每个单元格都是对同一单元格的引用。如果可以,请将Cell
更改为struct
而不是class
。作为值类型,每个单元格都是唯一的副本。
如果Cell
必须是class
,您可以使用嵌套的myArray
创建map
(技术上仍然是循环):
let myArray:[[Cell!]] = (1...10).map { _ in (1...10).map { _ in Cell() } }
注意,您应该使用以class
和struct
名称的大写字母开头的名称,这就是我将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