将值输出到 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)
我几乎可以肯定这个标题是不正确的,但这里...
我正在桥接到 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)