比方说,我有一个名为 Foo 的 Swift 结构
struct Foo
{
var a,b,c : Float
var d : Double
init()
{
a = 0
b = 0
c = 0
d = 0
}
}
Swift sizeof(Foo) 在 arm64 上打印 24 个字节,4 个字节用于 Float 字段,8 个用于 Double 和 4 个字节的填充。
所以我认为,在结构对齐方面没有特殊的 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 东西包装器,所以我想实现 @infix 方法,比如乘法,并将所有内部原生东西隐藏在 C 后面。例如,对于矩阵,这意味着我们需要从 = 中提取 & 符号&b*&c 表达式,因为如果有一种方法可以绕过它并在 @infix 方法实现的范围内从内存中获取原始点,我没有从你的答案和文档中得到。
像这样:
@infix public func *(l: Mat4, r: Mat4) -> Mat4
{
var m = Mat4()
_internalMat4Multiply(&l, &r, &m)
}
_internalMat4Multiply 是 void(void*, void*, void*) C 方法,执行所有计算
最佳答案
有两个问题:你不能获取一个常量(用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)
关于ios - 将 swift struct 指针传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25116782/