我已经创建了一个像这样的数组
var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: numeroDados)
现在我需要将其转换为Double
的数组。
我可以使用以下方式进行转换:
var newArray : [Double] = []
for i in 0..<n {
newArray[i] = outputReal
}
但是我记得在页面上看到了另一种方法。
有什么想法吗?
答案 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)
deck
extension UnsafeMutablePointer {
func toArray(capacity: Int) -> [Pointee] {
return Array(UnsafeBufferPointer(start: self, count: capacity))
}
}
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))
extension Array {
init(pointer: UnsafeMutablePointer<Element>, count: Int) {
let bufferPointer = UnsafeBufferPointer<Element>(start: pointer, count: count)
self = Array(bufferPointer)
}
}