0

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

我正在桥接一个 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>>>')

任何指针?

4

1 回答 1

2

一些观察:

  • TESTHANDLE似乎是一个别名UnsafeMutableRawPointer
  • &testHandle正在获取 的引用(指向位置的指针)testHandle,产生一个类型的值inout UnsafeMutableRawPointer
  • 正如错误所说,您的TestInit函数采用 type 的变量UnsafeMutablePointer<TESTHANDLE?>?,又名Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>

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

据我所知,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

您收到错误的原因是因为&testHandle只能将您UnsafeMutableRawPointer连接到 a Optional<UnsafeMutablePointer<UnsafeMutableRawPointer>>,而不是必需Optional<UnsafeMutablePointer<Optional<UnsafeMutableRawPointer>>>的(不同之处在于缺少“内部”可空性层)。要解决此问题,请自行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)
于 2019-04-25T02:08:03.590 回答