我试着像这样做:
let myArray: [[MyClass]] = [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
来初始化对象,则需要使用不同的对象。但是在相同实例的情况下,以下代码将起作用。此代码更适用于基本类型,如Int
或structs
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)]