在Swift中,如何将setter添加到不可变的GLKit向量结构中?

时间:2016-10-02 19:22:27

标签: swift immutability glkit

在Swift中GLKit向量是不可变的结构:

public struct _GLKVector2 {


    public var v: (Float, Float)

    public init(v: (Float, Float))

    public init()
}

extension GLKVector2 {

    public var x: Float { get }

    public var y: Float { get }

    public var s: Float { get }

    public var t: Float { get }

    public subscript(i: Int) -> Float { get }
}
public typealias GLKVector2 = _GLKVector2

我发现这有点限制,并希望扩展GLKVector2以包含相应的setter。我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以创建一个替换整个self的变异函数。

extension GLKVector2 {
    mutating func setX(_ x: Float) {
        self = GLKVector2Make(x, y)
    }
}

...

v2.setX(123)

您也可以创建一个属性,但要注意,您还需要编写自己的getter,而不能return self.x那里。

var x: Float {
    get {
        return v.0
        // Note:
        //  1. you need to use a getter
        //  2. you cannot `return x`, otherwise it will be an infinite recursion
    }
    set {
        self = GLKVector2Make(newValue, y)
    }
}