假设我有一个Vector
结构:
struct Vector
{
var x: Double = 0
var y: Double = 0
init(x: Double, y: Double)
{
self.x = x
self.y = y
}
}
我创建了一个中缀函数,它添加了两个Vector
结构:
func +(left: Vector, right: Vector) -> Vector
{
return Vector(left.x + right.x, left.y + right.y)
}
这很好,但当我想创建一个中缀函数,将两个Vectors
加在一起,并将左值设置为结果(如+=
)时,它就不起作用了:
func +=(left: Vector, right: Vector)
{
left.x += right.x
left.y += right.y
}
当我在代码中尝试它时,它没有任何作用。如果我将Vector
结构更改为一个类,那么它就可以工作了。
我知道Swift复制了structs
并引用了classes
,那么有没有办法做到这一点,或者这是不可能的?
提前感谢!
在当前形式的+=
函数中,您试图变异不可变的值类型的成员,这些成员本身是不可变的。如果将inout
关键字添加到函数签名中的left
,则此值类型将变为可变的,并且其突变将通过inout
:的复制入复制出行为更新(编译器优化:在实践中,如果可能的话,通过引用避免复制开销),然后+=
函数将按预期工作。
func +=(left: inout Vector, right: Vector)
{
left.x += right.x
left.y += right.y
}
初始函数适用于类类型的原因是不可变引用类型的成员本身是可变的;只有引用本身可能不会发生突变。
只需为左侧参数添加inout参数将被保存:
func += (left: inout Vector, right: Vector)
{
left.x += right.x
left.y += right.y
}