多年来,迅速的语法发生了变化,这种可以正常运行的代码不再存在...
var zerosR = [Float](count: windowSizeOverTwo, repeatedValue: 0.0)
var zerosI = [Float](count: windowSizeOverTwo, repeatedValue: 0.0)
var cplxData = DSPSplitComplex( realp: &zerosR, imagp: &zerosI )
let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )
vDSP_ctoz( xAsComplex, 2, &cplxData, 1, vDSP_Length(windowSizeOverTwo) )
vDSP_fft_zrip( setup, &cplxData, 1, log2n, FFTDirection(kFFTDirection_Forward) )
这段代码的每一行在Swift 4下都显示一个错误
我能够转换除此行以外的所有内容
let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )
无法编译并显示此错误
无法转换“ UnsafePointer”类型的值?达到预期 参数类型'UnsafePointer <_>?'
答案 0 :(得分:1)
指向Float
数组中的inputSignal
元素的指针必须被 rebound 指向指向DSPComplex
值的数组:
let inputSignal: [Float] = ...
inputSignal.withUnsafeBufferPointer {
floatPtr in
floatPtr.withMemoryRebound(to: DSPComplex.self) {
cmplxPtr in
vDSP_ctoz(cmplxPtr.baseAddress!, 2, &cplxData, 1, vDSP_Length(windowSizeOverTwo) )
}
}
另请参见UnsafeRawPointer Migration。
请注意,这些指针仅在执行闭包期间有效,并且不得传递给外部。您在
中所做的let xAsComplex = UnsafePointer<DSPComplex>( inputSignal.withUnsafeBufferPointer { $0.baseAddress } )
实际上是依靠未定义的行为。