Po pierwsze, używanie idiomu .withUnsafeBufferPointer { $0.baseAddress }
w celu pobrania adresu Swift Array
nie jest zalecane. Adres pobrany z tego języka nie może być ważny poza zamknięciem.
Tak, można napisać coś takiego:
inputSignal.withUnsafeBufferPointer {buffer in
buffer.baseAddress!.withMemoryRebound(to: DSPComplex.self, capacity: inputSignal.count/(MemoryLayout<DSPComplex>.size/MemoryLayout<Float>.size)) {xAsComplex in
//`xAsComlex` is guaranteed to be valid only in this closure.
//...
}
}
Jeśli trzeba użyć stabilnych wskaźników, które mogą być potrzebne do zarządzania ich jako rzeczywistych wskaźników.
let inputSignalCount = 512
let inputSignal = UnsafeMutablePointer<Float>.allocate(capacity: inputSignalCount)
inputSignal.initialize(to: 0.0, count: inputSignalCount)
//...
inputSignal.withMemoryRebound(to: DSPComplex.self, capacity: inputSignalCount/(MemoryLayout<DSPComplex>.size/MemoryLayout<Float>.size)) {xAsComplex in
//`xAsComlex` is guaranteed to be valid only in this closure.
//...
}
//...
//Later when `inputSignal` is not needed any more...
inputSignal.deinitialize(count: inputSignalCount)
inputSignal.deallocate(capacity: inputSignalCount)
dzięki, użyłem zamknięcia, zadziałało dobrze! –