Según la documentación de Swift, tanto las palabras clave de mutación como las de entrada y salida se utilizan para modificar los tipos de valores desde dentro de una función. ¿Hay alguna diferencia entre "mutar" e "inout" y cualquier caso especial en el que necesitemos usar cualquiera de ellos?
la mutating marca un método. inout marca un parámetro. Son cosas completamente diferentes.
Los métodos marcados con mutating pueden mutar a self , es decir, establecer propiedades de self , reasignarse a self mismos, etc.
struct Foo { var foo: Int mutating func mutate() { foo += 1 // this is mutating self } } Los parámetros marcados con inout básicamente se convierten en variables var , a diferencia de las constantes let . Puede cambiarlos y los cambios también se reflejarán en el lado de la persona que llama.
func f(_ x: inout Int) { x = 10 } var a = 1 f(&a) print(a) // 10Para mí, veo la diferencia solo en los lugares donde se usan.
El parámetro marcado con la palabra clave inout le permite pasar su valor a cualquier método similar como referencia
func square(inout num: Int) { num = num * num } Por el contrario, el método marcado con la palabra clave mutating se usa en el alcance del tipo y le permite cambiar el valor de este método.
extension Int { mutating func square() { self = self * self } }Los métodos de instancia de los tipos de valor no pueden cambiar las propiedades del tipo de valor (o el valor en sí), a menos que estén marcados como mutating .
Las funciones de cualquier tipo no pueden cambiar sus parámetros (y hacer que el cambio se propague fuera de la función) a menos que esos parámetros estén marcados como inout .
Hacen un trabajo similar, pero en diferentes contextos.