将C结构双指针转换为Swift结构不安全指针

时间:2018-07-02 14:25:01

标签: c swift

我需要在Swift(4)中进行以下C转换:

struct A ** castme = input
struct B * tothis = (struct B *)castme

在Swift中,castme类型为UnsafeMutablePointer<UnsafeMutablePointer<A>?>!

我认为我想投射到UnsafeMutablePointer<B>!吗?

还可以说我也可以直接将*(castme)强制转换为(struct B)吗?如果是,通过从UnsafeMutablePointer<A>?B进行转换是否会使转换更容易?

我看到了这个线程,但是无法从中获取所需信息: Cast to different C struct unsafe pointer in Swift

1 个答案:

答案 0 :(得分:2)

让我们根据C中发生的事情考虑一下。当我在C中进行指针转换时,表示指针类型的数据现在将被视为其他类型的指针。指针的值不会改变,只是您如何对待它。

Swift不喜欢做这种事情,也不鼓励您这样做,因为尽管价格便宜,但这样做从根本上是不安全的,并且可能导致数据损坏,跳入空间,总线错误等。

这并不意味着swift无法执行此操作。您指向的链接使用withUnsafePointerTo,它试图限制指针的使用范围。在您的情况下,您可能想看一下unsafeBitCast(文档here),它模仿了C指针的强制转换(一般而言,它与C强制转换并不严格相同,但对于指针来说,确实如此)。

let a:UnsafeMutablePointer<SomeType> = fetchASomeTypePointer()
let b = unsafeBitCast(a, to: UnsafeMutablePointer<SomeOtherType>.self)

这使表示指向SomeType的指针的数据现在变为指向SomeOtherType的指针。

就像我之前说过的那样,这是一件危险的事情,尤其是如果您不完全了解自己在做什么。