如何用大小创建Swift空二维数组

时间:2014-07-17 18:59:39

标签: arrays swift

我试着像这样做:

let myArray: [[MyClass]] = [5,5]

其中[5,5]是数组的大小。 我不能这样做。

5 个答案:

答案 0 :(得分:25)

如果你想创建一个多维数组类型的数组(即Int s,String s,structs),那么codester的答案中的语法很有用:

Swift 4

var arr = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)

Swift早先

var arr = [[Int]](count: 5, repeatedValue: [Int](count: 5, repeatedValue: 0))
arr[0][1] = 1
// arr is [[0, 1, 0, 0, 0], ...

如果你创建一个多维的引用类型数组(即类),这将获得一个对同一对象的许多引用的数组:

class C {
    var v: Int = 0
}
var cArr = [[C]](count: 5, repeatedValue: [C](count: 5, repeatedValue: C()))
// cArr is [[{v 0}, {v 0}, {v 0}, {v 0}, {v 0}], ...
cArr[0][1].v = 1
// cArr is [[{v 1}, {v 1}, {v 1}, {v 1}, {v 1}], ...

如果你想创建一个数组(单维或多维)的引用类型,你可能最好动态地创建数组:

var cArr = [[C]]()
for _ in 0..<5 {
    var tmp = [C]()
    for _ in 0..<5 {
        tmp += C()
    }
    cArr += tmp
}
// cArr is [[{v 0}, {v 0}, {v 0}, {v 0}, {v 0}], ...
cArr[0][1].v = 1
// cArr is [[{v 0}, {v 1}, {v 0}, {v 0}, {v 0}], ...

(请参阅slazyk's answer了解使用map()的等效短语法。)

或制作一系列可选项并填写其值:

var optArr = [[C?]](count: 5, repeatedValue: [C?](count: 5, repeatedValue: nil))
// optArr is [[nil, nil, nil, nil, nil], ...
optArr[0][1] = C()
// optArr is [[nil, {v 0}, nil, nil, nil], ...

答案 1 :(得分:5)

创建填充了同一类不同对象的5x5数组。 也许不是最漂亮的解决方案,而是一个有效的解决方案,并避免使用for循环:

let myArray = [[MyClass]](map(0..<5) { _ in
    [MyClass](map(0..<5) { _ in
        MyClass()
    })
})

修改
因为这个问题实际上是为了创造“空”。数组大小&#39;,我必须补充说,你不能让它“空”&#39;如果它不是可选类型。但如果这是您想要的,您也可以rickster suggests at the bottom of his answer完成,只需创建nil的5x5数组。

答案 2 :(得分:4)

要添加到接受的答案,在Swift 3中,语法略有不同:

var arr = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)

请注意参数的顺序和repeating而不是repeatedValue

答案 3 :(得分:2)

您可以通过以下代码执行此操作,它将使用相同的默认值初始化二维数组,在这种情况下, MyClass 对象的相同实例,这不是那么好。如果需要使用for-loop来初始化对象,则需要使用不同的对象。但是在相同实例的情况下,以下代码将起作用。此代码更适用于基本类型,如Intstructs String但不适用于Classes。但是如果我显示二维数组初始化的语法

let myArray: [[MyClass]] = [[MyClass]](count: 5, repeatedValue:[MyClass](count: 5, repeatedValue:MyClass()));

更好的方法是使用原始数据类型和stuct

它将使用两个MyClass对象填充数组。如果要提供大小,则Swift需要默认值。 来自Swift编程指南

  

“Swift的Array类型还提供了用于创建数组的初始化器   一定大小,其所有值都设置为提供的默认值   值。您将此初始化程序传递给要添加的项目数   新数组(称为count)和相应的默认值   输入“


到目前为止,我不知道只有intialize其内存的任何方式,但不能填充一定大小的Swift数组。以上代码将填充5的默认MyClass个对象* 5。

答案 4 :(得分:0)

对于每个组件的不同维度(非方阵)的二维数组,您可以编写

var arr2D: [[Int]] = [Array<Int>(repeating: 1, count:2), Array<Int>(repeating: 2, count:3)]