根据Swift文档,mutation和inout关键字均用于从函数内部修改值类型。 “变异”和“输入”之间有什么区别,以及在任何特殊情况下我们都需要使用它们之一。
答案 0 :(得分:10)
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
答案 1 :(得分:2)
对我来说,我看到的只是在使用它们的地方有所不同。
标有inout
关键字的参数允许您将值传递给与引用相似的任何方法
func square(inout num: Int) {
num = num * num
}
与此相反,在类型范围中使用了标记为mutating
的关键字的方法,该方法允许您更改此方法本身的值
extension Int {
mutating func square() {
self = self * self
}
}
答案 2 :(得分:2)
值类型的实例方法不能更改值类型的属性(或值本身),除非将其标记为mutating
。
除非将这些参数标记为inout
,否则任何类型的函数都不能更改其参数(并且更改会传播到函数外部)。
他们做了类似的工作,但是背景不同。
答案 3 :(得分:1)
inout:-这意味着修改局部变量也将修改传入的参数。没有它,传入的参数将保持相同的值。
mutating:-默认情况下,不能在其实例方法中修改值类型的属性。为了修改值类型的属性,必须在实例方法中使用mutating关键字。