将值输出到 swift 中的 typedef 指针

outputting a value to a typedef pointer in swift

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

我正在桥接到 Objective-C class 以设置 typedef。桥已建立,我可以正确声明 typedef var。

在 Objective-C 中,我还从同一个 class 中调用了一个方法,调用该方法时,会将一个值输出到变量 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>>>')

有什么指点吗?

一些观察:

  • TESTHANDLE 似乎是 UnsafeMutableRawPointer
  • 的别名
  • &testHandle 正在获取 testHandle 的引用(指向位置的指针),生成类型为 inout UnsafeMutableRawPointer
  • 的值
  • 如错误所述,您的 TestInit 函数采用 UnsafeMutablePointer<TESTHANDLE?>?、a.k.a 类型的变量。 Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>

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

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

Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>

实际上是两个 "semantic" 部分:

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

您收到错误的原因是 &testHandle 只能将您的 UnsafeMutableRawPointer 桥接到 Optional<UnsafeMutablePointer<UnsafeMutableRawPointer>>,而不是所需的 Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>(区别在于在缺失的 "inner" 可空性层中)。为了解决这个问题,让你的 testHandle 可选,你自己:

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

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

typealias TESTHANDLE = UnsafeMutableRawPointer

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

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