Swift 导致未定义行为的结构
Swift structures causing undefined behaviour
我正在编写一个使用 Metal 的程序。我正在使用结构定义统一缓冲区布局。当我在 swift 中声明结构时,它无法绘制。但是当我在 Objective-C 中声明结构并使用桥接 header 导入它时,它工作正常。实际的计算逻辑完全相同。唯一的变化是声明。以下是声明:
Objective-C 声明(这个有效):
struct Uniforms {
struct Matrix4x4 modelViewMatrix;
struct Matrix4x4 projectionMatrix;
struct Matrix3x3 normalMatrix;
struct Vector3 lightPosition;
};
和 Swift 声明:
struct Uniforms {
var modelViewMatrix: Matrix4x4!
var projectionMatrix: Matrix4x4!
var normalMatrix: Matrix3x3!
var lightPosition: Vector3!
}
请注意,数学类型是 Objective-C 中定义的结构,并充当 Swift.
的包装器
有关详细信息,这里是 Swift 计算值并将它们发送到 Metal 的代码:
// Declaration:
var uniforms: Uniforms!
...
// Part where I compute the values:
self.uniforms = Uniforms()
let eye = vector3Create(0.0, 5.0, 7.0)
let center = vector3Create(0.0, 0.0, 0.0)
let up = vector3Create(0.0, 1.0, 0.0)
self.uniforms.modelViewMatrix = MathOperations.lookAt(eye, center: center, up: up)
let aspect = Float(self.view.bounds.size.width / self.view.bounds.size.height)
self.uniforms.projectionMatrix = MathOperations.perspective(45.0, aspect: aspect, near: 0.01, far: 100.0)
self.uniforms.normalMatrix = getMatrix3x3FromMatrix4x4(self.uniforms.modelViewMatrix)
self.uniforms.lightPosition = vector3Create(0.0, 5.0, 7.0)
self.vertexBuffer = device.newBufferWithBytes(self.vertexArray, length: self.vertexArray.count * sizeof(Float), options: .CPUCacheModeDefaultCache)
self.uniformBuffer = device.newBufferWithBytes(&self.uniforms, length: sizeof(Uniforms), options: .CPUCacheModeDefaultCache)
抱歉所有代码,但请帮忙。谢谢
我试图在这里解释我添加到问题中的评论,这看起来是一个正确的答案。
转换此Objective-C
代码的正确方法:
struct Matrix4x4 modelViewMatrix;
到Swift
是不是这个
var modelViewMatrix: Matrix4x4!
因为这样我们就不会创建 Matrix4x4
类型的变量。相反,我们正在创建 Matrix4x4
.
类型的 Optional
类型的变量
这意味着在 Swift 中变量 modelViewMatrix
能够假设 nil
值,而在 Objective-C 中则不能。
Let's remember that in Objective-C a variable having a struct as type
cannot be nil.
所以将原始语句从 Objective-C
翻译成 Swift
的正确方法如下:
var modelViewMatrix: Matrix4x4
我正在编写一个使用 Metal 的程序。我正在使用结构定义统一缓冲区布局。当我在 swift 中声明结构时,它无法绘制。但是当我在 Objective-C 中声明结构并使用桥接 header 导入它时,它工作正常。实际的计算逻辑完全相同。唯一的变化是声明。以下是声明:
Objective-C 声明(这个有效):
struct Uniforms {
struct Matrix4x4 modelViewMatrix;
struct Matrix4x4 projectionMatrix;
struct Matrix3x3 normalMatrix;
struct Vector3 lightPosition;
};
和 Swift 声明:
struct Uniforms {
var modelViewMatrix: Matrix4x4!
var projectionMatrix: Matrix4x4!
var normalMatrix: Matrix3x3!
var lightPosition: Vector3!
}
请注意,数学类型是 Objective-C 中定义的结构,并充当 Swift.
的包装器有关详细信息,这里是 Swift 计算值并将它们发送到 Metal 的代码:
// Declaration:
var uniforms: Uniforms!
...
// Part where I compute the values:
self.uniforms = Uniforms()
let eye = vector3Create(0.0, 5.0, 7.0)
let center = vector3Create(0.0, 0.0, 0.0)
let up = vector3Create(0.0, 1.0, 0.0)
self.uniforms.modelViewMatrix = MathOperations.lookAt(eye, center: center, up: up)
let aspect = Float(self.view.bounds.size.width / self.view.bounds.size.height)
self.uniforms.projectionMatrix = MathOperations.perspective(45.0, aspect: aspect, near: 0.01, far: 100.0)
self.uniforms.normalMatrix = getMatrix3x3FromMatrix4x4(self.uniforms.modelViewMatrix)
self.uniforms.lightPosition = vector3Create(0.0, 5.0, 7.0)
self.vertexBuffer = device.newBufferWithBytes(self.vertexArray, length: self.vertexArray.count * sizeof(Float), options: .CPUCacheModeDefaultCache)
self.uniformBuffer = device.newBufferWithBytes(&self.uniforms, length: sizeof(Uniforms), options: .CPUCacheModeDefaultCache)
抱歉所有代码,但请帮忙。谢谢
我试图在这里解释我添加到问题中的评论,这看起来是一个正确的答案。
转换此Objective-C
代码的正确方法:
struct Matrix4x4 modelViewMatrix;
到Swift
是不是这个
var modelViewMatrix: Matrix4x4!
因为这样我们就不会创建 Matrix4x4
类型的变量。相反,我们正在创建 Matrix4x4
.
Optional
类型的变量
这意味着在 Swift 中变量 modelViewMatrix
能够假设 nil
值,而在 Objective-C 中则不能。
Let's remember that in Objective-C a variable having a struct as type cannot be nil.
所以将原始语句从 Objective-C
翻译成 Swift
的正确方法如下:
var modelViewMatrix: Matrix4x4