В Swift, как мне добавить установщик к неизменяемым векторным структурам GLKit?

#swift #immutability #glkit

#swift #неизменяемость #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 , включив соответствующие установщики. Как мне это сделать?

Ответ №1:

Вы могли бы создать мутирующую функцию, которая заменяет целое self .

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

...

v2.setX(123)
  

Вы также можете создать свойство, но будьте осторожны, вам также нужно будет написать свой собственный геттер, а вы этого не можете 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)
    }
}
  

Комментарии:

1. Мне это нравится. Могу ли я не перегружать x, y, z, s, t получатели как для set, так и для get?