将swift变量作为void传递给C api**
我有一个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
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?>