C中offsetof(struct,member)的Swift中的等价物是什么?

Liz*_* Hu 2 memory struct offset swift

这是Swift中的一个结构:

struct A {
    var x
    var y
    var z
}
Run Code Online (Sandbox Code Playgroud)

我应该怎么做,以获得偏移y的结构A,就像offsetof(A, y)用C?

谢谢 :)

Mar*_*n R 6

MemoryLayout.offset(of:) 在 Swift 4.2 中添加,并实现

例子:

struct A {
    var x: Int8
    var y: Int16
    var z: Int64
}

MemoryLayout.offset(of: \A.x) // 0
MemoryLayout.offset(of: \A.y) // 2
MemoryLayout.offset(of: \A.z) // 8
Run Code Online (Sandbox Code Playgroud)

备注:这应该也可以工作,但是(从 Swift 4.2 开始)无法编译(错误SR-8335):

MemoryLayout<A>.offset(of: \.y)
// error: Expression type 'Int?' is ambiguous without more context
Run Code Online (Sandbox Code Playgroud)


ric*_*ter 5

Swift目前没有为Swift中定义的结构定义标准内存布局.这意味着您编写的任何通过指针数学分解结构的代码都不能保证可以在Swift编译器的未来版本或更新版本上运行.(正如@robmayoff所说,这是Swift获得稳定ABI的一部分,这是今年第5版Swift项目的目标之一.)

但是,如果您的结构在C中定义并通过桥接头导入,则Swift会尊重其内存的C二进制布局.在这种情况下,该MemoryLayout类型提供C sizeof运算符和类似实用程序的等价物.仍然没有offsetof等价物,但你可以通过stride在C声明顺序中添加成员类型的s来自己做指针数学.

例如,Apple文档提供SCNGeometrySource了从交错顶点/法线/纹理坐标数据的缓冲区创建3D对象的示例.但它(目前)用ObjC编写,使用sizeofstrideof告诉SceneKit在哪里可以找到缓冲区中的各种数据.Swift等价物将MemoryLayout<Float>.size代替sizeof(float)等等,代替offsetof(MyVertex, nx)你需要观察在nx字段和结构之前结构中有三个浮点数MemoryLayout<Float>.stride * 3.