【问题标题】:Error in UnsafeMutablePointer in swift3swift3中的UnsafeMutablePointer错误
【发布时间】:2016-11-15 08:56:55
【问题描述】:

我的鳕鱼是这样的

let samples = UnsafeMutableBufferPointer<Int16>(start:UnsafeMutablePointer(buffer.mData), count: Int(buffer.mDataByteSize)/sizeof(Int16))

运行此代码时出现以下错误

Cannot invoke initializer for type 'UnsafeMutablePointer<_>' with an argument list of type '(UnsafeMutableRawPointer?)'

buffer.mdata 有原始数据。我该如何解决这个问题。提前致谢

【问题讨论】:

  • 您可以编辑问题以显示mData 声明吗?

标签: swift swift3 unsafe-pointers


【解决方案1】:

假设buffer 是来自AVFoundationAudioBuffer 框架:buffer.mData 是一个“可选的原始指针” UnsafeMutableRawPointer?,在 Swift 3 中你必须 绑定 指向类型化指针的原始指针:

let buffer: AudioBuffer = ...

if let mData = buffer.mData {
    let numSamples = Int(buffer.mDataByteSize)/MemoryLayout<Int16>.size
    let samples = UnsafeMutableBufferPointer(start: mData.bindMemory(to: Int16.self, capacity: numSamples),
                                             count: numSamples)
    // ...
}

SE-0107 UnsafeRawPointer API 有关原始指针的更多信息。

【讨论】:

    【解决方案2】:

    根据文档:

    // Creates an UnsafeMutablePointer over the count contiguous Element instances beginning at start.
    init(start: UnsafeMutablePointer<Element>?, count: Int)
    

    所以

    let samples = UnsafeMutableBufferPointer<Int16>(start:UnsafeMutablePointer(buffer.mData), count: Int(buffer.mDataByteSize)/sizeof(Int16))
    

    会是这样的:

    let byteSize = Int16(buffer.mDataByteSize)/sizeOf(Int16)
    let buffer:UnsafeMutablePointer<Int16> = buffer.mData.assumingMemoryBound(to: Int16.self)
    let samples = UnsafeMutableBufferPointer<Int16>(start:buffer, count:byteSize)
    

    有多种方法可以将UnsafeMutableRawPointer 转换为UnsafeMutablePointer&lt;T&gt;。 Martin 在上面的答案中已经给出了一个转换,另一个在这个例子中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多