在 swift 中转换和强制指针有什么区别?

What's the difference between casting and coercing a pointer in swift?

动机是尝试使用带有 C API 的回调,我在其中通过 void 指针传递任何我想要的东西。

所以假设我有一个 x: UnsafePointer<Void>。我知道 really 是什么,所以我想适当地转换指针。使用 unsafeBitCast 或仅将 UnsafePointer 应用于 x 有什么区别?也就是说

let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self)

不同于

let z = UnsafePointer<MyStruct>(x)

在某种程度上?

unsafeBitCastany 两个大小相同的 Swift 类型之间的不安全转换。也就是说,您可以写 unsafeBitCast(x, UnsafePointer<MyStruct>.self),但也可以写 unsafeBitCast(x, MyClass.self)unsafeBitCast(x, Int.self)。这通常是非常不安全的,因为 Swift 不能保证其类型的内存布局。在您的情况下,使用 UnsafePointer 或 Unmanaged 可能是更好的选择。

"coercion" UnsafePointer<MyStruct>(x) 并不是真正的特殊语言功能,它只是 an UnsafePointer initializer 需要另一个 UnsafePointer。它的作用是将同一内存地址处的值重新解释为不同类型,类似于 C 中指针类型之间的转换(或 C++ 中的 static_casting)。两种Swift类型(UnsafePointer的两种变体)之间的转换是安全的,当然它们仍然是Unsafe指针,所以你必须确定你访问的是记忆正确;您仍然负责分配和解除分配。