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鈥檛 mutable: 鈥榥umber鈥 is a 鈥榣et鈥 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! 馃憤