【问题标题】:Swift 5.1 Initialilize Array Multidimensional with unsafeUninitializedCapacitySwift 5.1 使用 unsafeUninitializedCapacity 初始化多维数组
【发布时间】:2020-06-17 22:35:20
【问题描述】:

为了初始化一个二维Int数组如下 https://github.com/apple/swift-evolution/blob/master/proposals/0245-array-uninitialized-initializer.md

var myArray = Array<Int>(unsafeUninitializedCapacity: 10) { buffer, initializedCount in
    for x in 1..<5 {
        buffer[x] = x
    }
    buffer[0] = 10
    initializedCount = 5
}
// myArray == [10, 1, 2, 3, 4]

我尝试了接下来的两个代码,但它们不起作用:

var myArray = [[Int]](unsafeUninitializedCapacity: 3) { bufferfilas, initializedCountfilas in
    for x in 0..<3 {
        bufferfilas[x] = [Int](unsafeUninitializedCapacity:3) {buffercolumnas, initializedCountcolumnas in
            for y in 0..<3{
                buffercolumnas[y] = y 
            }
            initializedCountcolumnas = 3
        }
    }
    initializedCountfilas = 9
}

第二个:

var myArray = [[Int]](var myArray = [[Int]](unsafeUninitializedCapacity: 9) { buffer, initializedCount in
for x in 0..<3 {
    for y in 0..<3{
        buffer[x][y] = (x*10)+y 
    }
}
    initializedCount = 9
}

swift 5.1 中初始化二维数组的正确方法是哪一种?

提前致谢。

【问题讨论】:

  • 您只想初始化一个二维数组,或者您还需要访问未初始化存储?
  • 两者,主要目标是初始化,但我想了解Swift5.1中的unsafeUninitializedCapacity。在以前版本的 Swift 中工作:self.cells = [[Cell]](unsafeUninitializedCapacity:filas, initializingWith:[Cell](unsafeUninitializedCapacity:columnas, initializingWith: UnsafeMutableBufferPointer, Cell(row: 0,col: 0)))

标签: ios arrays swift multidimensional-array initialization


【解决方案1】:

下面是来自docs的初始化声明

init(unsafeUninitializedCapacity: Int, initializingWith initializer: (inout UnsafeMutableBufferPointer<Element>, inout Int) throws -> Void) rethrows

要创建一个二维数组,Element 应该是另一个数组。 以下是如果您希望将第二个数组初始化为普通数组而不是使用 unsafeUninitializedCapacity

的示例
var my2DArray = Array<Array<Int>>(unsafeUninitializedCapacity: 10) { (buffer: inout UnsafeMutableBufferPointer<Array<Int>>, count: inout Int) in
    for a in 0..<5 {
        buffer[a] = [a]
    }
    count = 5
}

对于不安全的版本

var my2DArrayUnsafe = Array<Array<Int>>(unsafeUninitializedCapacity: 10) { (buffer: inout UnsafeMutableBufferPointer<Array<Int>>, count: inout Int) in
    for a in 0..<5 {
        buffer[a] = Array<Int>(unsafeUninitializedCapacity: 10, initializingWith: { (subBuffer: inout UnsafeMutableBufferPointer<Int>, subCount: inout Int) in
            for subA in 0..<5 {
                subBuffer[subA] = subA
            }
            subCount = 5
        })
    }
    count = 5
}

【讨论】:

  • 太棒了!有用!非常感谢!
猜你喜欢
  • 2018-12-29
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2015-05-12
相关资源
最近更新 更多