在Swift 3中将C数组ptr转换为本机数组

Joh*_*alo 2 swift swift3

我有一个来自C库的ptr,它指向一个Floats数组.它的类型是UnsafeMutablePointer.如何在Swift 3中创建本机[Float]数组?

这是我正在尝试的:

var reconstructedFloats = [Float](repeatElement(0, count: size))
reconstructedFloats.withUnsafeMutableBufferPointer {
  let reconstructedFloatsPtr = $0
  print(type(of:$0)) // "UnsafeMutableBufferPointer<Float>"
  cFloatArrayPtr?.withMemoryRebound(to: [Float].self, capacity: size) {
    UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: $0.pointee, as: Float.self)
  }

UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: (cFloatArrayPtr?.pointee)!, as: Float.self)
}
Run Code Online (Sandbox Code Playgroud)

这似乎过于复杂,所以希望有一种简单的方法,但即使这段代码也会产生编译错误:Type of expression is ambiguous without more context.

如果你想将它插入游乐场,这里是一个设计cFloatArrayPtr的完整示例:

// Let's contrive a C array ptr:
var size = 3
var someFloats: [Float] = [0.1, 0.2, 0.3]
var cFloatArrayPtr: UnsafeMutablePointer<Float>?

someFloats.withUnsafeMutableBufferPointer {
    cFloatArrayPtr = $0.baseAddress
}

print(type(of:cFloatArrayPtr!)) // "UnsafeMutablePointer<Float>"

var reconstructedFloats = [Float](repeatElement(0, count: size))
reconstructedFloats.withUnsafeMutableBufferPointer {
    let reconstructedFloatsPtr = $0
    print(type(of:$0))
    cFloatArrayPtr?.withMemoryRebound(to: [Float].self, capacity: size) {
        UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: $0.pointee, as: Float.self)
    }

    UnsafeMutableRawPointer(reconstructedFloatsPtr.baseAddress!).storeBytes(of: (cFloatArrayPtr?.pointee)!, as: Float.self)
}

print(reconstructedFloats)
Run Code Online (Sandbox Code Playgroud)

zne*_*eak 5

你可以用UnsafeBufferPointer指针做一个.UnsafeBufferPointer是一个Sequence,所以你可以直接从它做一个数组:

let buffer = UnsafeBufferPointer(start: cFloatArrayPtr, count: size)
var reconstructedFloats = Array(buffer)
Run Code Online (Sandbox Code Playgroud)

当然,这会创建一个副本.