动机是尝试使用带有 C API 的回调,在其中我通过 void 指针传入任何我想要的东西。
假设我有一个 x: UnsafePointer<Void>
.我知道它真正是什么,所以我想适本地转换指针。使用 unsafeBitCast 或仅将 UnsafePointer 应用于 x 有什么区别?也就是说
是
let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self)
不同于
let z = UnsafePointer<MyStruct>(x)
某种程度上?
最佳答案
unsafeBitCast
是 任何 两种大小相同的 Swift 类型之间的不安全转换。即可以写unsafeBitCast(x, UnsafePointer<MyStruct>.self)
, 但你也可以写成 unsafeBitCast(x, MyClass.self)
或 unsafeBitCast(x, Int.self)
.这通常是非常不安全的,因为 Swift 不能保证其类型的内存布局。使用 UnsafePointer 或 Unmanaged在您的情况下可能是更好的选择。
“胁迫”UnsafePointer<MyStruct>(x)
不是真正的特殊语言功能,它只是 an UnsafePointer initializer这需要另一个 UnsafePointer。它的作用是将同一内存地址处的值重新解释为不同类型,类似于 C 中指针类型之间的转换(或 C++ 中的 static_cast
ing)。两种 Swift 类型(UnsafePointer 的两种变体)之间的转换是安全的,但当然它们仍然是 UnsafePointers,所以你必须确定你正在正确访问内存;您仍然负责分配和取消分配。
关于swift - 在 swift 中转换和强制指针有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524680/