【问题标题】:Cannot invoke initializer for type UnsafePointer<_> with an argument list of type (UnsafeMutableRawPointer)无法使用类型 (UnsafeMutableRawPointer) 的参数列表调用 UnsafePointer<_> 类型的初始化程序
【发布时间】:2017-12-24 04:43:59
【问题描述】:

当我从音频缓冲区数据中写入多点连接中的输出流时,我得到了错误

无法使用参数调用 UnsafePointer<_> 类型的初始化程序 类型列表(UnsafeMutableRawPointer)

我找到了很多解决方案,但这个解决方案对我没有帮助。

我的代码是:

func send(_ buffer: AudioBuffer) {
        print(buffer.mData!)
        print(buffer.mDataByteSize)

        outputStreme?.write(UnsafePointer(buffer.mData), maxLength: buffer.mDataByteSize)
    }

提前谢谢..:)

【问题讨论】:

  • 你需要在 Swift 3 中使用 Data 而不是 NSData
  • @KKRocks 我这是不安全的可变原始指针,但我想要不安全的指针,因为它在输出 stram 参数中使用

标签: ios xcode swift3 outputstream multipeer-connectivity


【解决方案1】:

当某种规范更改影响您的代码时,请查看官方参考。在您的情况下,AudioBuffer.mData 的类型为 UnsafeMutableRawPointer?,您需要将其传递给类型为 UnsafePointer&lt;UInt8&gt;OutputStream.write(_:maxLength:) 的第一个参数。

UnsafeMutableRawPointer

你可以找到这个返回UnsafeMutablePointer&lt;T&gt;的方法:

func assumingMemoryBound&lt;T&gt;(to: T.Type)

bound 的概念有点令人困惑,但似乎您可以将其用于指针类型转换:

outputStreme?.write(buffer.mData!.assumingMemoryBound(to: UInt8.self), maxLength: Int(buffer.mDataByteSize))

(假设强制展开 ! 足够安全,正如您的 print(buffer.mData!) 所建议的那样。)

对于大多数返回指针的 API,

内存绑定-ness 没有很好的定义,目前还没有效果。还有另一种类型转换方法func bindMemory&lt;T&gt;(to: T.Type, capacity: Int),两者都可以正常工作(同样,目前为止)。

【讨论】:

  • 谢谢你,先生......你是天才
【解决方案2】:

试试这个:

withUnsafePointer(to: &data) {rawUuidPtr in //<- `rawUuidPtr` is of type `UnsafePointer<uuid_t>`.
            let bytes = UnsafeRawPointer(rawUuidPtr).assumingMemoryBound(to: UInt8.self)
            outputStream.write(bytes, maxLength: 4)
        }

【讨论】:

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