【问题标题】:How to create Swift empty two dimensional array with size如何创建具有大小的 Swift 空二维数组
【发布时间】:2014-07-17 18:59:38
【问题描述】:

我试着这样做:

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

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

【问题讨论】:

标签: arrays swift


【解决方案1】:

如果您想创建一个值类型的多维数组(即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], ...

【讨论】:

  • 另外值得注意的是,在最后一个代码 sn-p(以及第一个代码)中,重复值 [C?](和 [Int])很好,因为 (从 Beta 3 开始)数组是具有完整值语义的值类型。
  • @rickster 如果可以的话,我会给你 1000 ups。谢谢你。真的在找那个
  • 很好的答案。在初始化之前,一个可选数组的指针会是什么样子?像这样?: var optArr: [[C?]]
【解决方案2】:

创建 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 数组。

【讨论】:

    【解决方案3】:

    为了补充已接受的答案,在 Swift 3 中,语法略有不同:

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

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

    【讨论】:

      【解决方案4】:

      您可以通过以下代码来执行此操作,它将使用相同的默认值初始化二维数组,在这种情况下是 MyClass 对象的相同实例,这不是那么好。万一你需要不同的对象,您需要创建for-loop 来初始化对象。但如果对于相同的实例,以下代码将起作用。此代码更适合Intstructs 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 对象。

      【讨论】:

      • 这将使 5x5 数组的所有元素都引用同一个 MyClass 实例,这可能不是您想要的。
      • @rickster 你是对的,它将创建具有相同 MyClass 实例的 5*5 数组,因为它是默认值,并且对于数组的所有元素具有相同的值
      • 是 5x5 数组还是 5x5 数组?
      【解决方案5】:

      对于每个分量不同维度的二维数组(不是方阵),你可以写

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-17
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 2021-06-06
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多