2016-09-19 8 views
5

tu jest błąd:„init” jest niedostępny: stosowanie „withMemoryRebound (do pojemności: _)” tymczasowo zobaczyć pamięć jako inny układ zgodny typu

'init' is unavailable:use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type. 

tutaj jest mój kod:

var inputSignal:[Float] = Array(repeating: 0.0, count: 512) 

let xAsComplex = UnsafePointer<DSPComplex>(inputSignal.withUnsafeBufferPointer { $0.baseAddress })//error here 

dlaczego? Jak to naprawić?

Odpowiedz

2

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

dzięki, użyłem zamknięcia, zadziałało dobrze! –

Powiązane problemy