改变结构的中缀函数 Swift

Mutating Infix Functions for Structs Swift

假设我有一个 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 结构更改为 class,那么它就可以工作。

我知道 Swift 复制了 structs 并引用了 classes,那么有什么办法可以做到这一点吗?

提前致谢!

只需为您的左参数添加 inout 参数,以便值 将被保存:

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

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

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

您的初始函数适用于 class 类型的原因是不可变引用类型的成员本身是可变的;只有引用本身不能被改变。