gpt4 book ai didi

swift - 为 Structs Swift 改变中缀函数

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:43 26 4
gpt4 key购买 nike

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

提前致谢!

最佳答案

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

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

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

关于swift - 为 Structs Swift 改变中缀函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com