将swift变量作为void传递给C api**

将swift变量作为void传递给C api**,swift,Swift,我有一个C api,如下所示 struct foo_private_t; typedef foo_private_t* foo_t; void foo_func(void**x); API打算这样使用的地方 foo_t x; void foo_func((void**) &x); 为什么API采用了void**而不是foo\u t*,这超出了这个问题的范围。问题是当我试图从swift调用此API时。首先,我通过桥接头将C头导入swift。然后我尝试用指向swift对象的指针调用foo

我有一个C api,如下所示

struct foo_private_t;
typedef foo_private_t* foo_t;
void foo_func(void**x);
API打算这样使用的地方

foo_t x;
void foo_func((void**) &x);
为什么API采用了
void**
而不是
foo\u t*
,这超出了这个问题的范围。问题是当我试图从swift调用此API时。首先,我通过桥接头将C头导入swift。然后我尝试用指向swift对象的指针调用foo_func

var x:foo_t?
foo_func(&x)
// error is cannot convert value of type 'foo_t?' (aka 'Optional<OpaquePointer>') to expected argument type 'UnsafeMutableRawPointer?'

搜索此错误会发现,如果调用swift函数,我应该对参数使用
inout
修饰符。但由于我调用的是一个C api,所以我不确定是否可以进行这样的修改。我怎样才能传递一个可变值的指针呢?

我能够让它工作

var e = UnsafeMutableRawPointer(x)
foo_func(&e)
x
已经是指针,因此可以将其转换为原始指针。然后我需要一个指向原始指针的指针,所以我取
e
的地址。我想我需要
e
变量,因为隐式临时值不能作为参数传递给
inout
参数。例如

foo_func(&UnsafeMutableRawPointer(x))
// error is cannot convert value of type 'foo_t?' (aka 'Optional<OpaquePointer>') to expected argument type 'UnsafeMutableRawPointer?'
foo_func(&UnsafeMutableRawPointer(x))
//错误是无法将类型为“foo_t”(也称为“可选”)的值转换为预期的参数类型“UnsafemtableRawPointer”

如果打算将
x的地址传递给C函数
在某种程度上,
foo_func()
可以为
x
分配一个新值 是什么C代码

foo_t x;
void foo_func((void**) &x);
是的)那么它将是:

var x: foo_t?

withUnsafeMutablePointer(to: &x) {
    $0.withMemoryRebound(to: UnsafeMutableRawPointer?.self, capacity: 1) {
        foo_func($0)
    }
}
在带有unsafemeutablepointer()的
内部,
$0
是一个

UnsafeMutablePointer<foo_t?>
unsafemeutablepointer
这是反弹到预期类型的指针

UnsafeMutablePointer<UnsafeMutableRawPointer?>
unsafemeutablepointer
foo_func是否仅读取传递的指针或为其分配新值?在后一种情况下,您的解决方案将更新
e
,但不会更新
x
UnsafeMutablePointer<foo_t?>
UnsafeMutablePointer<UnsafeMutableRawPointer?>