【问题标题】:outputting a value to a typedef pointer in swift快速将值输出到 typedef 指针
【发布时间】:2019-09-14 09:08:10
【问题描述】:

我几乎可以肯定这个标题是不正确的,但这里是......

我正在桥接一个 Objective-C 类来设置 typedef。桥已建立,我可以正确声明 typedef var。

在 Objective-C 中,我还从同一个类中调用了一个方法,该方法在调用时会向变量 TestHandle 输出一个值。

var TestHandle : TESTHANDLE
TestInit(&TestHandle)

当我使用 Swift 5 尝试此操作时,我收到此错误:

Cannot convert value of type 'inout TESTHANDLE' (aka 'inout UnsafeMutableRawPointer') to expected argument type 'UnsafeMutablePointer<TESTHANDLE?>?' (aka 'Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>')

任何指针?

【问题讨论】:

  • UpperCamelCase 保留用于 Swift 中的类型名称。您应该使用 lowerCamelCase 命名您的变量、属性等。
  • 罗杰,从现在开始这样做
  • 这个 API 的文档是什么? C 的 API 非常依赖文档(因为 C 的类型系统本身并没有太多的交流,例如谁负责分配和释放给定的指针)
  • 您可以点击链接完成所有操作:raywenderlich.com/… 更具体地说,您的TestInit 函数需要TESTHANDLE* aka void**。如果是这样,您需要将变量TestHandle 声明为var TestHandle: UnsafeMutablePointer&lt;HANDLE?&gt;

标签: ios swift typedef unsafemutablepointer


【解决方案1】:

一些观察:

  • TESTHANDLE 似乎是 UnsafeMutableRawPointer 的别名
  • &amp;testHandle 正在获取testHandle 的引用(指向位置的指针),产生inout UnsafeMutableRawPointer 类型的值
  • 正如错误所说,您的TestInit 函数采用UnsafeMutablePointer&lt;TESTHANDLE?&gt;? 类型的变量,也就是Optional&lt;UnsafeMutablePointer&lt;Optional&lt;UnsafeMutableRawPointer&gt;&gt;&gt;

Swift 有一些关于&amp; 如何自动桥接到各种指针类型的规则,但坦率地说,我不太了解它们。

据我所知,Swift 指针类型不能代表 nil (0x000...000)。为此,它们需要被包装在一个可选项中。所以当你看到类型时

Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>

实际上是两个“语义”部分:

Optional<UnsafeMutablePointer<    Optional<UnsafeMutableRawPointer>    >>
↳ A nullable pointer to ...       ↳ ... something that's a nullable pointer of unspecified (void) type

您收到错误的原因是因为&amp;testHandle 只能将您的UnsafeMutableRawPointer 连接到Optional&lt;UnsafeMutablePointer&lt;UnsafeMutableRawPointer&gt;&gt;,而不是必需的Optional&lt;UnsafeMutablePointer&lt;Optional&lt;UnsafeMutableRawPointer&gt;&gt;&gt;(不同之处在于缺少“内部”可空性层) .要解决此问题,请自行将testHandle 设为可选:

var testHandle: TESTHANDLE? // a.k.a. Optional<TESTHANDLE>, a.k.a. Optional< UnsafeMutableRawPointer>

然后,当您使用 &amp; 运算符时,Swift 会将您的值包装在所需的 Optional&lt;UnsafeMutablePointer&lt; ... &gt;&gt; 外层中。

typealias TESTHANDLE = UnsafeMutableRawPointer

func testInit(_ p: UnsafeMutablePointer<TESTHANDLE?>?) {
    print("Success!")
}

var testHandle: TESTHANDLE? = nil
testInit(&testHandle)

【讨论】:

  • 那么小?拿着我的拳头抽动的金罐。感谢先生的详尽解释和解决方案。可以肯定地说我不明白,但我会重新阅读并尝试这样做!
  • @DanJamesPalmer 随时提出后续问题!
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多