问题描述
我正在尝试将 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
参数),因为它可能已经将一些内存复制到寄存器或堆栈中,它需要知道你'重新使这些副本无效。