2016-09-19 8 views
5

としてメモリを表示するには、エラーである:ここで「INIT」が使用できない:利用「withMemoryRebound(全容量:_)」一時的にここで別のレイアウト互換型

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

は私のコードである:

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

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

なぜですか?それを修正するには?

答えて

2

まず、.withUnsafeBufferPointer { $0.baseAddress }のイディオムを使用して、Swift Arrayのアドレスを取得することはお勧めしません。そのイディオムから取り出されたアドレスは、クロージャの外側で有効であるとは保証されません。あなたが安定したポインタを使用する必要がある場合

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. 
     //... 
    } 
} 

は、あなたが実際のポインタとして、それらを管理する必要がある場合があります

だから、あなたはこのような何かを書くことができます。

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

ありがとう、私は閉鎖を使用して、うまくいった! –

関連する問題