为结构Swift改变中缀函数

时间:2016-03-30 23:44:59

标签: swift infix-operator

所以说我有一个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,所以有没有办法做到这一点,或者这是不可能的?

提前致谢!

2 个答案:

答案 0 :(得分:2)

只需为左侧参数添加inout参数即可 将被保存:

func += (inout left : Vector, right: Vector)
{
  left.x += right.x
  left.y += right.y
}

答案 1 :(得分:2)

在当前表单的+=函数中,您试图改变不可变类型的成员,这些成员本身是不可变的。如果在函数签名中将inout关键字添加到left,则此值类型将变为可变,并且通过inout更新其变异:s copy-in-copy-out行为(编译器优化) :在实践中通过引用避免复制开销,如果可能的话),之后您的+=函数将按预期工作。

func +=(inout left: Vector, right: Vector)
{
    left.x += right.x
    left.y += right.y
}

你的初始函数对类类型起作用的原因是不可变引用类型的成员本身是可变的;只有引用本身可能不会发生变异。