5

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

4

4 回答 4

17

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
于 2019-03-27T07:11:03.780 回答
2

对我来说,我只是在使用它们的地方看到了差异。

用关键字标记的inout参数允许您将值传递给与引用类似的任何方法

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

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

extension Int {

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

}
于 2019-03-27T07:10:44.707 回答
2

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

任何类型的函数都不能更改它们的参数(并让更改传播到函数之外),除非这些参数被标记为inout.

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

于 2019-03-27T07:10:55.327 回答
1

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

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

于 2019-03-27T08:31:23.840 回答