No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Parámetros tipo inout

6/16
Recursos

Aportes 12

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

//Parámetros tipo inout
func swapTwoInts(_ a: inout Int,_ b: inout Int){
    let tempA = a
    a = b
    b = tempA
}

var someInt = 3
var otherInt = 7
print("someInt var \(someInt) y otherInt vale \(otherInt)")
swapTwoInts(&someInt, &otherInt)
print("someInt var \(someInt) y otherInt vale \(otherInt)")

No se en que ámbito se puede usar inout… Creo que es una mala práctica y algo bastante peligroso…

Esto guarda mucha relación con punteros y operadores de indirección 🤠


let x = 5
func addOne(number: Int) {
//    number += 1
    print("El numero ahora vale \(number)")
}
addOne(number: x)

La operación number += 1 no se puede realizar porque los parámetros de una función son de solo lectura (constantes).

El error que veremos es:

Left side of mutating operator isn’t mutable: ‘number’ is a ‘let’ constant.

Para resolver este problema se utiliza la palabra reservada inout en la definición de cada parámetro:


func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let tempA = a
    a = b
    b = tempA
}

var someInt = 3
var otherInt = 7
print("someInt vale \(someInt) y otherInt vale \(otherInt)")

Ahora, para pasar los parámetros a la función, tenemos que utilizar el operador & para indicar que estamos pasando una referencia (dirección de memoria) de la variable y no una copia del mismo.

swapTwoInts(a: &Int, b: &Int)


swapTwoInts(&someInt, &otherInt)
print("someInt vale \(someInt) y otherInt vale \(otherInt)")

// outputs:
someInt vale 3 y otherInt vale 7
someInt vale 7 y otherInt vale 3

// para poder alterar los valores de los parámetros se usa: inout
// y luego, al llamar la función se usa '&'
func swapTwoInts(_ a: inout Int, _ b: inout Int){
    let tempA = a
    a = b
    b = tempA
}

var someInt = 3
var otherInt = 7

print("SomeInt vale \(someInt) y otherInt vale \(otherInt)")

swapTwoInts(&someInt, &otherInt)

print("SomeInt vale \(someInt) y otherInt vale \(otherInt)")

Creo que puede ser utilizado para funciones reactivas que usan mucho en aplicaciones web dinámicas.

Creo que así queda claro lo que pasa con una función inout

seguro tiene su aplicación muy particular pero cuando empiezas a manipular referencias en lugar de pasar mensajes entre objetos se puede llegar a estados de inconsistencia difíciles de mantener.

Me sorprendió que el profesor dijera que es un tema complicado porque me quedo super claro, al contrario me reventó la cabeza fue algo como wow 🤯🤯

Excelente profesor!

Por si alguno se pregunta como seria con el ejemplo anterior:

var x = 5

func addOne(number: inout Int) {
    number += 1
}
addOne(number: &x)
print("El numero ahora vale \(x)")

puede ser una funcion de doble filo 🤔

Gracias por tan buena explicación, me quedo claro! 👍