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

时间:2019-03-31 13:50:20

标签: swift unsafe-pointers

我已经创建了一个像这样的数组

var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: numeroDados)

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

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

var newArray : [Double] = []

for i in 0..<n {
  newArray[i] = outputReal
}

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

首先创建一个引用同一存储区的UnsafeBufferPointer<Double>。那是Collection,因此您可以从该内存创建和初始化数组:

let bufPtr = UnsafeBufferPointer(start: outputReal, count: numeroDados)
let newArray = Array(bufPtr)

或者,首先分配一个UnsafeMutableBufferPointer(既保存地址又分配已分配内存的大小):

let numeroDados = 10

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

let newArray = Array(outputReal)

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

答案 1 :(得分:1)

您的意思是将Pointer转换为double到double数组吗?

您不应该将指针转换为double到swift中的double数组,因为swift中的array不一定与C数组相同。而是将内容复制到新数组中。一种“低级”的方法是

    parseInt()
    toFixed()
    floor()

请记住,这不是 安全,如果您犯了一些错误,例如新数组太小或指针没有期望的元素太多,则会崩溃。

答案 2 :(得分:1)

详细信息

  • Xcode 11.2.1(11B500),Swift 5.1

解决方案1 ​​

deck

解决方案1的用途

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

解决方案2

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))

解决方案2的使用

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