【发布时间】:2014-07-17 18:59:38
【问题描述】:
我试着这样做:
let myArray: [[MyClass]] = [5,5]
其中 [5,5] 是数组的大小。 我做不到。
【问题讨论】:
-
@Wabonano:该答案包含仅适用于 beta3 前
Array行为的警告。 cadaster 的答案适用于 beta 3 ......还有其他注意事项。
我试着这样做:
let myArray: [[MyClass]] = [5,5]
其中 [5,5] 是数组的大小。 我做不到。
【问题讨论】:
Array 行为的警告。 cadaster 的答案适用于 beta 3 ......还有其他注意事项。
如果您想创建一个值类型的多维数组(即Ints、Strings、结构),codester 答案中的语法效果很好:
斯威夫特 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], ...
【讨论】:
创建 5x5 数组,其中填充了同一类的 不同 对象。 也许不是最漂亮的解决方案,而是一个可行的解决方案,并且避免了 for 循环:
let myArray = [[MyClass]](map(0..<5) { _ in
[MyClass](map(0..<5) { _ in
MyClass()
})
})
编辑:
由于问题实际上是创建具有“大小”的“空”数组,因此我必须补充一点,如果它不是可选类型,则不能将其设置为“空”。但如果这是您想要的,您也可以使用 rickster suggests at the bottom of his answer 并创建 nil 的 5x5 数组。
【讨论】:
为了补充已接受的答案,在 Swift 3 中,语法略有不同:
var arr = [[Int]](repeating: [Int](repeating: 0, count: 5), count: 5)
注意参数的顺序和repeating 而不是repeatedValue。
【讨论】:
您可以通过以下代码来执行此操作,它将使用相同的默认值初始化二维数组,在这种情况下是 MyClass 对象的相同实例,这不是那么好。万一你需要不同的对象,您需要创建for-loop 来初始化对象。但如果对于相同的实例,以下代码将起作用。此代码更适合Int 或structs String 等原始类型,但不适用于@987654326 @.But 以防我展示二维数组初始化的语法
let myArray: [[MyClass]] = [[MyClass]](count: 5, repeatedValue:[MyClass](count: 5, repeatedValue:MyClass()));
最好使用原始数据类型和stuct
它将用两个维度的MyClass 对象填充数组。如果您提供大小,Swift 中需要默认值。
来自 Swift 编程指南
“Swift 的 Array 类型还提供了一个用于创建数组的初始化器 具有一定大小,其所有值都设置为提供的默认值 价值。您向此初始化程序传递要添加到的项目数 新数组(称为计数)和适当的默认值 输入”
到目前为止,我不知道有什么方法可以只使用 intialize 它的内存,但不知道将数组填充到特定大小的 Swift 中。上面的代码将填充默认的 MyClass 5*5 对象。
【讨论】:
MyClass 实例,这可能不是您想要的。
MyClass 实例的 5*5 数组,因为它是默认值,并且对于数组的所有元素具有相同的值
对于每个分量不同维度的二维数组(不是方阵),你可以写
var arr2D: [[Int]] = [Array<Int>(repeating: 1, count:2), Array<Int>(repeating: 2, count:3)]
【讨论】: