如何将UnsafeMutablePointer <Double>数组转换为Double数组?

Spa*_*Dog 2 unsafe-pointers swift

我已经创建了这样的数组

var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: numeroDados)
Run Code Online (Sandbox Code Playgroud)

现在,我需要将其转换为的数组Double

我可以使用以下方式进行转换:

var newArray : [Double] = []

for i in 0..<n {
  newArray[i] = outputReal
}
Run Code Online (Sandbox Code Playgroud)

但是我记得在页面上看到了另一种方法。

有任何想法吗?

Vas*_*huk 7

细节

  • Xcode 11.2.1 (11B500)、Swift 5.1

解决方案1

extension UnsafeMutablePointer {
    func toArray(capacity: Int) -> [Pointee] {
        return Array(UnsafeBufferPointer(start: self, count: capacity))
    }
}
Run Code Online (Sandbox Code Playgroud)

溶液1的使用

var array = [3.9, 7.7, 11.1, 1.11, 1.02, 3.3, 3.9, 0]
let pointer = UnsafeMutablePointer<Double>.allocate(capacity: array.count)
pointer.initialize(from: &array, count: array.count)
print(pointer.toArray(capacity: array.count))
Run Code Online (Sandbox Code Playgroud)

解决方案2

extension Array {
    init(pointer: UnsafeMutablePointer<Element>, count: Int) {
        let bufferPointer = UnsafeBufferPointer<Element>(start: pointer, count: count)
        self = Array(bufferPointer)
    }
}
Run Code Online (Sandbox Code Playgroud)

溶液2的使用

var array2 = [3.9, 7.7, 11.1, 1.11, 1.02, 3.3, 3.9, 0]
let pointer2 = UnsafeMutablePointer<Double>.allocate(capacity: array.count)
pointer2.initialize(from: &array, count: array.count)
print(Array(pointer: pointer2, count: array.count))
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 5

首先创建一个UnsafeBufferPointer<Double>引用相同的内存区域。这样就Collection可以从该内存创建和初始化数组:

let bufPtr = UnsafeBufferPointer(start: outputReal, count: numeroDados)
let newArray = Array(bufPtr)
Run Code Online (Sandbox Code Playgroud)

或者,首先分配一个UnsafeMutableBufferPointer(同时保留分配的内存的地址和大小):

let numeroDados = 10

let outputReal = UnsafeMutableBufferPointer<Double>.allocate(capacity: numeroDados)
outputReal.initialize(repeating: 0.0)

let newArray = Array(outputReal)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,值都将复制到数组的元素存储中,因此最终必须释放释放的内存。