【问题标题】:Cannot convert value of type 'UnsafePointer<T>' to expected argument type 'UnsafePointer<Int16>'无法将“UnsafePointer<T>”类型的值转换为预期的参数类型“UnsafePointer<Int16>”
【发布时间】:2021-10-02 13:05:44
【问题描述】:

我正在尝试手动将 Swift 3 代码转换为 Swift 5,但在尝试强制转换内存时出现错误。

   let buffer: UnsafePointer<Int16>

   init<T>(buffer: UnsafePointer<T>) {
      self.buffer  = UnsafePointer<Int16>(buffer)
   }

错误是强制类型转换,新的 Swift 版本不允许。

   Cannot convert value of type 'UnsafePointer<T>' to expected argument type 'UnsafePointer<Int16>'

我不确定将内存重新绑定到“UnsafePointer&lt;Int16&gt;”的正确方法是什么,强制

【问题讨论】:

    标签: ios swift swift3 swift5 unsafemutablepointer


    【解决方案1】:

    The UnsafePointer reference page 解释了正确但乏味的过程:

    当您需要将内存永久重新绑定到不同类型时,首先获取指向内存的原始指针,然后在原始指针上调用bindMemory(to:capacity:) 方法。以下示例将uint8Pointer 引用的内存绑定到UInt64 类型的一个实例:

    let uint64Pointer = UnsafeRawPointer(uint8Pointer)
                              .bindMemory(to: UInt64.self, capacity: 1)
    

    您应该告诉编译器您要重新绑定多少内存(使用capacity 参数),因为它可能已经将部分内存复制到了寄存器或堆栈中,并且它需要知道您正在失效那些副本。

    【讨论】:

    • 我将这一行修改为 self.buffer = UnsafeRawPointer(buffer).bindMemory(to: T.self, capacity: length)....但仍然得到同样的错误
    • 应该是.bindMemory(to: UInt16.self, capacity: someNumberOfUInt16s),因为你要创建一个UnsafePointer&lt;UInt16&gt;
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-07-02
    • 2016-03-21
    相关资源
    最近更新 更多