【问题标题】:Convert UnsafeMutablePointer to UnsafePointer将 UnsafeMutablePointer 转换为 UnsafePointer
【发布时间】:2018-08-01 13:52:20
【问题描述】:

我在我的 Swift 项目中使用了一个 C 库,其中一个函数需要 UnsafePointer<UnsafePointer<UInt8>?>! 作为我应该传递数据的输入输出参数。但问题是我有这个UnsafeMutablePointer<UnsafeMutablePointer<UInt8>?>!类型的数据。

我的问题是 - 在 Swift 3 中将 UnsafeMutablePointer 转换为 UnsafePointer 的最有效和最简单的方法是什么?这些指针在“纸面上”并没有太大的不同,它们与技术背景也不应该有太大的不同,但我找不到关于该主题的有价值的信息。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 该函数是如何在 C 中声明的?
  • 也许使用unsafeBitCast
  • @MartinR 您好,感谢您的回答!我认为这并不重要,但在这里:int av_image_alloc(uint8_t *pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align);
  • @Cristik 你好!我不知道这是否是一个有效的解决方案,但感谢您的建议!
  • @EugeneAlexeev 它的效率为 100%,因为它在 O(1) 中运行,但不确定编译器或运行时是否会让您正确转换。顾名思义,它是不安全的,因为如果使用不当,最终可能会出现意想不到的结果。

标签: swift pointers swift3 unsafe-pointers unsafemutablepointer


【解决方案1】:

UnsafePointers can be initialized with an UnsafeMutablePointer

// Any UnsafeMutablePointer with capacity one
let ump = UnsafeMutablePointer<Any>.allocate(capacity: 1)
// `up` now contains an UnsafePointer initialized with `ump`
var up = UnsafePointer(ump)

【讨论】:

  • 如果你写var up = UnsafePointer(ump),那么up的类型会被自动推断出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多