Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 导致未定义行为的快速结构_Objective C_Swift_Struct_Metal - Fatal编程技术网

Objective c 导致未定义行为的快速结构

Objective c 导致未定义行为的快速结构,objective-c,swift,struct,metal,Objective C,Swift,Struct,Metal,我正在写一个使用金属的程序。我正在使用一个结构定义统一的缓冲区布局。当我用swift声明结构时,它无法绘制。但是,当我在Objective-C中声明结构并使用桥接头导入它时,它工作得很好。计算的实际逻辑完全相同。唯一的变化是声明。声明如下: 目标C声明(此声明有效): 以及Swift声明: struct Uniforms { var modelViewMatrix: Matrix4x4! var projectionMatrix: Matrix4x4! var norma

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

目标C声明(此声明有效):

以及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;
to
Swift
而不是这个

var modelViewMatrix: Matrix4x4!
因为这样我们就不会创建类型为
Matrix4x4
的变量。相反,我们正在创建一个类型为
Optional
的变量,类型为
Matrix4x4

这意味着在Swift中,变量
modelViewMatrix
可以假定
nil
值,而在Objective-C中则不能

让我们记住,在Objective-C中,变量的类型为struct 不能为零

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

var modelViewMatrix: Matrix4x4

为什么要在Swift struct optionals中创建4个字段?谢谢!起初我将它们设置为可选的,因为我认为既然它们是以声明开始的,那么一开始就需要为零。但现在我使它们不可为null,并用构造函数填充结构。现在它工作了!另一方面,为什么金属不接受期权?GPU帧捕获在缓冲区中显示正确的数据,即使是可选的。很好,我添加了更多信息作为答案。如果它确实解决了你的问题,请接受它。
var modelViewMatrix: Matrix4x4