Swift中的“变异”函数和“输入”参数之间有什么区别吗?

时间:2019-03-27 07:04:07

标签: ios swift struct inout mutating-function

根据Swift文档,mutation和inout关键字均用于从函数内部修改值类型。 “变异”和“输入”之间有什么区别,以及在任何特殊情况下我们都需要使用它们之一。

4 个答案:

答案 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关键字。