"mutating"函数和Swift中的"inout"参数有区别吗?

Is there any difference between "mutating" function and "inout" parameters in Swift?

根据 Swift 文档,mutating 和 inout 关键字都用于从函数内修改值类型。 "mutating" 和 "inout" 之间有什么区别,以及我们需要使用它们中的任何一个的任何特殊情况。

对我来说,我只在使用它们的地方看到了不同。

标有inout关键字的参数允许您将您的值传递给类似于参考的任何方法

func square(inout num: Int) { 
    num = num * num
}

与之相反,用 mutating 关键字标记的方法在类型范围内使用,并允许您从该方法更改值本身

extension Int {

    mutating func square() {
        self = self * self
    }

}

值类型的实例方法不能更改值类型的属性(或值本身),除非它们被标记为 mutating

除非这些参数被标记为 inout.

,否则任何类型的函数都不能更改它们的参数(并且更改会传播到函数外部)

他们做类似的工作,但在不同的环境中。

mutating 标记方法。 inout 标记一个参数。它们是完全不同的东西。

标有 mutating 的方法可以改变 self 即设置 self 的属性,重新分配 self

struct Foo {
    var foo: Int

    mutating func mutate() {
        foo += 1 // this is mutating self
    }
}

标有inout的参数基本上成为var变量,而不是let常量。您可以更改它们,并且更改也会反映在调用方。

func f(_ x: inout Int) {
    x = 10
}

var a = 1
f(&a)
print(a) // 10

inout:- 意思是修改局部变量也会修改传入的参数。没有它,传入的参数将保持相同的值。

mutating:-默认情况下不能在其实例方法中修改值类型的属性。为了修改值类型的属性,您必须在实例方法中使用 mutating 关键字。