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

标签 swift pointers void-pointers

动机是尝试使用带有 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/

相关文章:

Swift:动画 uilayoutconstraints 和更改 alpha 会导致崩溃

c++ - 如何通过 vector::pointer push_back vector 中的数据?

c++ - 判断 std::vector 是否已重新放置其数组的最佳方法是什么?

ios - 从使用的类型泛型之一推断泛型类型

ios - 在 iOS 中查找两个日期的差异

ios - 从 xib 文件动态加载 iOS View

c++ - 在 C/C++ 中,char* arrayName[][] 是指向指针的指针还是指向指针的指针?

c - 在 Julia 中声明 C void 指针的正确方法

c - 使用带有 void 指针参数的函数

c - 在自定义 malloc 中附加调试 header