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)
但是我记得在页面上看到了另一种方法。
有任何想法吗?
extension UnsafeMutablePointer {
func toArray(capacity: Int) -> [Pointee] {
return Array(UnsafeBufferPointer(start: self, count: capacity))
}
}
Run Code Online (Sandbox Code Playgroud)
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)
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)
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)
首先创建一个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)
在这两种情况下,值都将复制到数组的元素存储中,因此最终必须释放释放的内存。