Swift 5.1 Initialilize Array Многомерный с unsafeUninitializedCapacity - PullRequest
0 голосов
/ 05 марта 2020

Чтобы инициализировать двумерный массив 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?

Заранее спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

Ниже приводится объявление инициализатора из 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...