Swift - 如何更改 get-only 的值 属性

Swift - How to change value of get-only property

大家好,我是 swift 和 OpenGL 的新手。我正在学习 objective C 中编写的教程并将其转换为 Swift 2.0

这是代码

float radius = self.view.bounds.size.width/3; 
GLKVector3 center = GLKVector3Make(self.view.bounds.size.width/2, self.view.bounds.size.height/2, 0);
GLKVector3 P = GLKVector3Subtract(touchPoint, center);

P = GLKVector3Make(P.x, P.y * -1, P.z);

float radius2 = radius * radius;
float length2 = P.x*P.x + P.y*P.y;

if (length2 <= radius2)
    P.z = sqrt(radius2 - length2);
else
{
    P.z = radius2 / (2.0 * sqrt(length2));
    float length = sqrt(length2 + P.z * P.z);
    P = GLKVector3DivideScalar(P, length);
}

这是我的Swift代码

    let radius: CGFloat = self.view.bounds.size.width/3
    let center: GLKVector3 = GLKVector3Make(Float(self.view.bounds.size.width / 2), Float(self.view.bounds.size.height/2), 0.0)
    var P: GLKVector3 = GLKVector3Subtract(touchPoint, center)

    P = GLKVector3Make(P.x, P.y * -1, P.z)

    let radius2 = radius * radius
    let length = P.x * P.x + P.y * P.y

    if(Float(length) <= Float(radius2)){
        P.z = sqrt(Float(radius2) - Float(length)) //the error is here
    } else {
        //other code
    }

我无法更改 P.z 的值,它说

"Cannot assign property: 'z' is a get-only property"

提前致谢

您需要创建一个新的 GLK3DVectorMake。似乎在 Swift 中桥接使用 Struct。

结构是不可变的,除非它们在内部实现中发生变化。一种克服方法是创建一个具有正确属性的新 GLK3DVectorMake。它是一种广泛使用的技术,用于修改 CGRect、CGPoint 和任何结构类型。

 if(Float(length) <= Float(radius2)){
    let newz = sqrt(Float(radius2) - Float(length)) 
    P = GLKVector3Make(P.x, P.y * -1, newz)
 }