无法将“UnsafePointer<T>”类型的值转换为预期的参数类型“UnsafePointer<Int16>”

问题描述

我正在尝试将 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<Int16>”的正确方法强制

解决方法

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

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

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

你应该告诉编译器你重新绑定了多少内存(使用 capacity 参数),因为它可能已经将一些内存复制到寄存器或堆栈中,它需要知道你'重新使这些副本无效。