UnsafeMutablePointer 到UnsafeMutablePointer <_>
我真的要疯了傻,显然简单的问题...... 我有一个Data
转换为AVAudioPCMBuffer
。UnsafeMutablePointer <Float>到UnsafeMutablePointer <_>
寻找this question它似乎很容易,但一切都随着Swift 3而改变。这种不断变化的诅咒语言(遗憾的是爆发)!
我的代码
let audioBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat!, frameCapacity: UInt32(data.count)/(audioFormat?.streamDescription.pointee.mBytesPerFrame)!)
audioBuffer.frameLength = audioBuffer.frameCapacity
let channels = UnsafeBufferPointer(start: audioBuffer.floatChannelData, count: Int(audioFormat!.channelCount))
data.copyBytes(to: UnsafeMutablePointer<Float>(channels[0]))
这个片段,但最后一行给了我这个错误:
Cannot convert value of type 'UnsafeMutablePointer<Float>' to expected
argument type 'UnsafeMutablePointer<_>'
五月某人有一个解决的办法?
检查API Reference of Data
,你可以找到的copyBytes
3个重载:
func copyBytes(to: UnsafeMutablePointer<UInt8>, count: Int)
func copyBytes(to: UnsafeMutablePointer<UInt8>, from: Range<Data.Index>)
他们没有采取UnsafeMutablePointer<Float>
作为to:
参数。
(而在你的代码中,channels[0]
类型变得UnsafeMutablePointer<Float>
,将它传递给的UnsafeMutablePointer<Float>
初始值设定为“什么都不做”。)
如果你要拨打的第三copyBytes
,你需要创建一个UnsafeMutableBufferPointer<DestinationType>
,在你的情况下DestinationType
应该是Float
。
_ = data.copyBytes(to: UnsafeMutableBufferPointer(start: channels[0], count: Int(audioBuffer.frameLength)))
(from:
说法是在这个copyBytes
可选的,没有把_ =
,斯威夫特抱怨没有使用的结果。)
如果你想使用的copyBytes
其他重载,您可能需要转换UnsafeMutablePointer<Float>
到UnsafeMutablePointer<UInt8>
。你可以在SO的其他文章中找到如何做到这一点。请记住count:
和from:
(在第二个)不是可选的。
您可能需要将第三行声明为UnsafeBufferPointer'? –
sdasdadas