Есть ли какая-либо разница между «мутирующей» функцией и параметрами «inout» в Swift? - PullRequest
3 голосов
/ 27 марта 2019

Согласно документации Swift, для изменения типов значений внутри функции используются ключевые слова mutating и inout.Есть ли разница между «мутированием» и «inout» и любым особым случаем, когда нам нужно использовать любой из них.

Ответы [ 4 ]

10 голосов
/ 27 марта 2019

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
2 голосов
/ 27 марта 2019

Методы экземпляра типов значений не могут изменять свойства типа значения (или само значение), если только они не помечены как mutating.

Функции любого вида не могут изменять свои параметры (и эти изменения распространяются за пределыфункции), если эти параметры не помечены как inout.

Они выполняют аналогичную работу, но в разных контекстах.

2 голосов
/ 27 марта 2019

Я вижу разницу только в тех местах, где они используются.

Параметр, помеченный ключевым словом inout, позволяет передавать значение в любой метод, аналогичный справочному

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

В отличие от этого, метод, помеченный ключевым словом mutating, используется в области видимости и позволяет самому изменять значение из этого метода

extension Int {

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

}
1 голос
/ 27 марта 2019

inout: - Это означает, что изменение локальной переменной также изменит передаваемые параметры. Без этого переданные параметры останутся неизменными.

мутирование: -Свойства типов значений по умолчанию не могут быть изменены в его методах экземпляра. Чтобы изменить свойства типа значения, необходимо использовать ключевое слово mutating в методе экземпляра.

...