Force unwrapping de una variable optional
Clase 17 de 22 • Curso de Introducción a Swift (2019)
Contenido del curso
Clase 17 de 22 • Curso de Introducción a Swift (2019)
Contenido del curso
Carlos David Ramírez Gómez
Jesús Mur Fontanals
Guillermo Ramirez
Jonathan Meixueiro
Manuel De Faria
David Barreto
Alexander Lopez
Martin Urciuoli
José Javier Cueto Mejía
John Heder Giraldo Giraldo
Edgardo Marcano
Andrés Carrillo
Kenyi Teran
Alejandro Apodaca
César Humberto Grifaldo García
oscar ortiz
Miguel Álvarez García
Alexander Lopez
Alexander Lopez
Leonardo Zabala
Omar Leal
Maximiliano Ituarte
Luiggy Tamayo
Adrian Peralta
Elvis Milan
Platzi
También se podría validar e imprimir el valor nil con un operador ternario, para simplificar el if
por ejemplo
print(convertedAge != nil ? convertedAge! : "Valor nulo")
Yo lo de el force unwrapping lo veo como un cofre que no sabes que contiene, pero intuyes que contiene un Int, entonces con la llave (en este caso una exclamación) abres el cofre para confirmarlo.
definitivamente uno de los mejores maestro de Platzi
Y si... todo lo que dice tiene sentido
No entiendo Nada :S
Pudiste entender amigo? Como le hiciste aqui estamos para ayudarnos!
Míralo de esta forma.
Paso 1. Estás esperando un valor con un tipo de dato conocido "La variable convertedAge contiene un valor?????" (Haces uso del "?")
Paso 2. Compruebas que no sea un nil, es decir que realmente te llegó el dato que esperabas, en este caso un entero (42)
Paso 3. Aún así el sistema te dice "Puede que sea un valor o puede que no sea un valor", pero como tu lo comprobaste en el if que ya es un entero simplemente le indicas "No te preocupes!!!!! esta variable ya contiene un valor !!!!!!!!" (Haces uso del !).
Traté de hacer una analogía de como se vería a nivel lenguaje humano
print(miVariable ?? "Valor default")
Solo usar el Unwrapping solo si estamos seguros que el valor no puede ser Nil
let age : string? age = “32” let convertAge = int(age) print (convertAge!) //aqui estoy aplicando fuerza bruta a la variable, en otras palabras estoy forzando a indicarle que es una variable entera.Si Age no tuviera valor<nil> se generaria un error y rompimiento del codigo debido a que no es viable aplicar fuerza bruta a una variable nil, por eso es buena practica rodear a una variable que se le haya aplicado force unwrapping con un if validando si es nil if age =! nil { print (“no es nula /(convertAge!)”)} else{print(“es nula”)}
Excelente tu comentario para clarificar el concepto
puedes confirmar si trae algo de la siguiente manera:
if let age = convertedAge { print(age) } es una manera de hacer la comparación y también es muy legible
Buenas noches, tengo una consulta. Dentro del ejemplo dado por el profesor quisiera saber si la lectura es correcta.
print(convertedAge != nil ?
Dentro de esta parte del código, quisiera saber si el "...!= nill? se lee como no es nulo o no es nill. Caso contratrario me gustaría saber porque se usa ese signo de exclamación o que representa en el código. Muchas gracias."
La expresión != significa "Diferente a" por lo que esta validando si esa variable tiene cualquier valor que no sea nill
/* Force unwrapping = si hay o no hay valor */ //Checar si una variable esta o no esta let possibleAge = "31" let convertedAge = Int(possibleAge)//Int? //Siempre usar condicional para verificar que el valor no sea nil if convertedAge != nil{ //Si se está seguro que el valor no es nil, entonces se agrega ! al fila de la variable con posible Int? para que por fuerza se convierta el valor optional a entero print("La edad del usuario no es nula: \(convertedAge!)") }else{ print("La edad del usuario es nula") }
force unwrapping es establecer en una optional un valor definido mediante la utilización de la variable acompañado de !
Encuentro algo familiar con NullSafety que encontramos en Dart
Dejé esta respuesta anteriormente, la vuelvo a publicar como comentario por si a alguien le ayuda.
Paso 1. Estás esperando un valor con un tipo de dato conocido "La variable convertedAge contiene un valor?????" (Haces uso del "?")
Paso 2. Compruebas que no sea un nil, es decir que realmente te llegó el dato que esperabas, en este caso un entero (42)
Paso 3. Aún así el sistema te dice "Puede que sea un valor o puede que no sea un valor", pero como tu lo comprobaste en el if que ya es un entero simplemente le indicas "No te preocupes!!!!! esta variable ya contiene un valor !!!!!!!!" (Haces uso del !).
Traté de hacer una analogía de como se vería a nivel lenguaje humano
En versiones nuevas ya no muestra el Optional(31) simplemente lo ignora, hasta que haces el force unwrapping
No es muy recomendable utilizar Force unwrapping, me parece que en un programa un poco grande puede haber crashes por todos lados si se fuerza un valor que ha sido declarado como opcional, se debe utilizar para casos muy concretos.
Lo aconsejable luego de escuchar al profesor Juan, mientras se va agarrando el hilo, es hacer una validacion antes de hacer uso del Force Unwrapping!
🤔 Es decir, utilizamos un force unwrapping cuando estamos completamente seguros de que existe un valor dentro del optional (que no es ni)
//-------Force unwrapping-----// //metodo transformar la variable en cuestion a un tipo de dato no nulo //Hay que comprobar si la variable que vamos a usar no es nula para continuar if convertedVar != nil { print("la variable no es nula: convertedVar") } //el force unwrapping se logra con :"!" despues de la variable para transformarla print("el valor transformado con force unwrapping de la variable convertedVar es: \(convertedVar!)")//se cambia a valor no optional
el force unwrapping también presente en Rust (.unwrap()) se podría usar para prototipar de manera rápida un solución y luego pasarlo a un mejor manejo como el optional binding (if let x=optional { } ).
También cuando los el valor contenido siempre existirá, como cuando no viene de un input ó respuesta de servidor, pero uno nunca está 100% seguro del cambio de tipo de dato y si algún otro dev modifique el valor previamente al unwrapping :(
dejo una presentación que habla de unwrap en rust donde el concepto es similar.
nil?
El 'nil' representa la ausencia de valor, no es lo mismo que un puntero. En Swift, un opcional con 'nil' significa que no hay nada dentro, como una caja vacía.