首页 > 解决方案 > 为什么即使我分配了所有属性,我也需要使用 self.init() 初始化结构?

问题描述

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

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)
        )
    }
}

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

标签: swiftstructinit

解决方案


而不是试图columns从你的设置init,你应该只调用self.init(_ columns:)并传入 4 vector_float4s 作为 anArray而不是作为 a 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 版本。您从该视频链接的代码也无法在 Swift 5 中编译。

与您的问题无关,但 Swift 中的变量名称应该是 lowerCamelCase,projectionFrame正确的命名也是如此。


推荐阅读