导致未定义行为的Swift结构

时间:2015-08-11 17:26:54

标签: objective-c swift struct metal

我正在编写一个使用Metal的程序。我正在使用结构定义统一缓冲区布局。当我在swift中声明结构时,它无法绘制。但是当我在Objective-C中声明结构并使用桥接头来导入它时,它工作正常。计算的实际逻辑完全相同。唯一的变化是声明。以下是声明:

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)

对不起所有代码,但请帮忙。感谢。

1 个答案:

答案 0 :(得分:1)

我想在这里解释一下我在问题中添加的评论,这看起来是一个正确答案。

转换此Objective-C代码的正确方法:

struct Matrix4x4 modelViewMatrix;

Swift

var modelViewMatrix: Matrix4x4!

因为这样我们不会创建Matrix4x4类型的变量。相反,我们正在创建类型为Optional的{​​{1}}类型的变量。

这意味着在Swift中,变量Matrix4x4能够假定modelViewMatrix值,而在Objective-C中它不能。{/ p>

  

让我们记住在Objective-C中有一个结构作为类型的变量   不能没有。

因此,将原始语句从nil翻译为Objective-C的正确方法如下:

Swift