gpt4 book ai didi

swift - UnsafeMutablePointer 到 UnsafeMutablePointer<_>

转载 作者:行者123 更新时间:2023-11-28 06:29:06 31 4
gpt4 key购买 nike

我真的被一个愚蠢但看似简单的问题弄疯了......我必须将 Data 转换为 AVAudioPCMBuffer

寻找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>)

func copyBytes<DestinationType>(to: UnsafeMutableBufferPointer<DestinationType>, 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 中是可选的,如果不放置 _ =,Swift 会提示没有使用结果。)

如果你想使用 copyBytes 的其他重载,您可能需要转换 UnsafeMutablePointer<Float>UnsafeMutablePointer<UInt8> .您可以在 SO 的其他一些文章中找到如何执行此操作。请记住count:from: (在第二个)不是可选的。

关于swift - UnsafeMutablePointer<Float> 到 UnsafeMutablePointer<_>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892702/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com