#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?