为什么我需要用 self.init() 初始化结构,即使我分配了所有属性?

Why do I need to initialize the struct with self.init() even if I assign all of the properties?

simd_float4x4 中,columns 是唯一的 属性,但是,这不会完全起作用,因为我没有调用 self.init()。无论如何,一切都会被初始化。为什么编译器会抱怨?我在 this 视频中看到了类似的东西,它正在运行。为什么我做不到?

extension simd_float4x4 {
    init(ProjectionFrame: CGSize) {
        let Y = FOV(), FarZ = Float((Settings.VisibilityRange+1)*2), Z = FarZ / (NearZ - FarZ)
        columns = (vector_float4(Y / Float(ProjectionFrame.width / ProjectionFrame.height), 0, 0, 0), vector_float4(0, Y, 0, 0), vector_float4(0, 0, Z, -1), vector_float4(0, 0, Z * NearZ, 0))
    }
}

在视频中我注意到了这一点。

extension simd_float4x4 {
    init(translationX x: Float, x: Float, x: Float) {
        columns = (
            vector_float4(x, 0, 0, 0),
            vector_float4(0, x, 0, 0),
            vector_float4(0, 0, x, 0),
            vector_float4(0, 0, 0, 1)
        )
    }
}

并且编译器没有抱怨。怎么会抱怨我?

与其尝试从 init 设置 columns,不如调用 self.init(_ columns:) 并将 4 vector_float4 作为 Array 传递而不是 tuple.

extension simd_float4x4 {
    init(ProjectionFrame: CGSize) {
        let Y = FOV(), FarZ = Float((Settings.VisibilityRange+1)*2), Z = FarZ / (NearZ - FarZ)
        self.init([vector_float4(Y / Float(ProjectionFrame.width / ProjectionFrame.height), 0, 0, 0), vector_float4(0, Y, 0, 0), vector_float4(0, 0, Z, -1), vector_float4(0, 0, Z * NearZ, 0)])
    }
}

该视频已有 2 年历史,因此使用较早的 Swift 版本。您 link 从该视频中获得的代码也无法在 Swift 5.

中编译

与您的问题无关,但 Swift 中的变量名应该是小驼峰命名,因此 projectionFrame 是正确的命名。

或者我可以将它连接到 C

#include <simd/simd.h>
matrix_float4x4 ProjectPerspective(const float Ratio) {
    const float Y = 1/tanf(Rad(Settings.FOV+15)), FarZ = (Settings.VisibilityRange+1)*32, Z = FarZ/(NearZ-FarZ);
    return (matrix_float4x4){.columns = {{Y/Ratio, 0, 0, 0}, {0, Y, 0, 0}, {0, 0, Z, -1}, {0, 0, Z*NearZ, 0}}};
}