将swift结构指针传递给C函数

时间:2014-08-04 10:37:45

标签: ios pointers struct swift

让我们说,我有一个名为Foo的Swift结构

struct Foo
{
     var a,b,c : Float
     var d : Double
     init()
     {
        a = 0
        b = 0
        c = 0
        d = 0
     }
}

Swift sizeof(Foo)打印24个字节,4个字节用于Float字段,8个用于Double,4个字节用于arm64。

所以我认为,没有特殊的Swift魔法与结构对齐完成,我们可以自由地将指针传递给内部C函数,以便使用像NEON和Metal这样的东西,只要内置变量是联合,目前无法直接纳入Swift

不知何故,当我尝试使用

获取const void *(Swift中的ConstUnsafePointer<()>)时
let a = Foo()
let b = &a

我在第二个表达式

上遇到了令人讨厌的编译器错误
'Foo' is not convertible to '@lvalue inout $T1'

我是否遗漏了一些东西,这是通过设计完成的?

更新部分

Martn R,谢谢你的回答!不过,对我来说,整个情况并不是很清楚。我的目标是创建方便的Math stuff包装器,所以我想实现像乘法一样的@ infix方法并隐藏C后面的所有内部本机东西。例如,对于Matrices,这意味着我们需要从a =中拉出&符号& b *& c表达式,因为如果有办法绕过这个并且在@infix方法实现的范围内从内存中获取原始点,我没有从你的答案和Docs中获得。

像这样:

@infix public func *(l: Mat4, r: Mat4) -> Mat4
{
    var m = Mat4()
    _internalMat4Multiply(&l, &r, &m)
}

_internalMat4Multiply是void(void *,void *,void *)C方法,进行所有计算

1 个答案:

答案 0 :(得分:6)

有两个问题:您无法获取常量的地址(使用let定义), 并且您只能将变量的地址传递给函数参数。 假设你的C函数是

void myFunc(const void *data);

然后这会起作用:

var a = Foo()
myFunc(&a)

然而,不是在C和Swift中对相同的对齐做出假设,而是 或许应该更好地定义C API中的结构:

struct Foo {
    float a;
    float b;
    float c;
    double d;
};

void myFunc(const struct Foo *data);

并使用Swift代码:

var a = Foo(a: 0, b: 0, c: 0, d: 0)
myFunc(&a)
相关问题