¿Cómo se evalúa Swift IF LET?

He visto este código en el sitio Swift y varias publicaciones aquí y estoy tratando de comprender lo básico. ¿Cómo se evalúa esta línea?

if let name = optionalName { 

Estoy confundido, ya que no es name == nombre opcional, está asignando el valor, entonces, ¿cómo es cierto ese informe y por qué no es cierto cuando se reemplaza con john appleseed con nil, ya que todavía va a ser igual?

 var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" } 

Básicamente, la línea dice: “si puedes dejar que el nuevo name variable sea igual a la versión no opcional de optionalName , haz lo siguiente con él”. Como Martin señaló, esto se llama Enlace opcional .

El único propósito de esto es probar si una variable opcional contiene un valor real y vincular la forma no opcional a una variable temporal. Esta es la forma segura de “desenvolver” una opción o, en otras palabras, acceder al valor que figura en el opcional. De ninguna manera está probando la igualdad de ningún tipo. Solo está probando la existencia de un valor dentro de un opcional.

Un opcional está configurado o no establecido … dejándonos una decisión importante. “¿Cómo deberíamos escribir nuestro código para que pueda funcionar correctamente para 2 estados?”. La forma en que desenvolvemos la opción es lo que decide eso para nosotros.

Hay varios enfoques que puede usar para contrarrestar un parámetro opcional no establecido.

  • ¡Choque!
  • Valor predeterminado para algo, si no lo fue, establecido.
  • Grácilmente fallar es decir, no hacer nada, pero también si el valor fue establecido, entonces asignarlo.
  • Gracefully fail, sin embargo, si el valor está establecido … hacer algo (es más que una sola tarea).

A continuación se encuentran los 4 enfoques


Usar el desenvolvimiento forzado se bloqueará si no tiene un valor. Debería hacer esto si tener ese valor es de vital importancia, por ejemplo, el título de una película (cada película DEBE tener un nombre). ! se usa para el desenvolvimiento forzado.

 movieTitle = movie.title! 

Usar nil coalescente es otra forma que le dará más control , lo que significa que no se bloqueará si el valor no está establecido, ni ‘no lo configurará nada’ si no está configurado … haría lo que usted le diga hacer, por ejemplo, establecería por defecto / establecer el nombre de la película a untitled_movie si no hubiera un nombre establecido. ?? se usa para coalescencia nula.

 var movieTitle = movie.title ?? "untitled_Movie" 

Usar el encadenamiento opcional no hará nada si no tiene un valor, y establecerá el valor si tiene un valor. Hace esto por algo que tener su valor establecido no es de vital importancia, por ejemplo, para el nombre del agente de su actor . ? se usa para encadenamiento opcional.

 let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining) let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping) 

Usar if-let (o guard que son dos tipos diferentes de enlace opcional ) le dará más control , no se bloqueará si el valor no está establecido. Si el valor está establecido, entonces puedes hacer algo. Si no está configurado, puede agregar una instrucción else .

 if let supportingActor = movie.supportingActor{ print(" The supporting actor is \(supportingActor)} 

Esta es la forma más común de desenvolver, ya que el desenvolvimiento forzado debería desalentarse. Para más discusión sobre por qué se desaconseja, ver aquí . Para una buena comparación entre guard y if-let ver guard vs. if-let


Nota al margen:

El enlace opcional y el encadenamiento opcional se usan comúnmente juntos:

 if let agent = movie.leadActor?.agent { ContactInfo = agent.phoneNumber } // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining* 

La syntax if acepta 2 condiciones diferentes. El segundo, un enlace opcional, no es un booleano. Esto es confuso, ya que puedes escribir:

 if let name = optionalName { 

pero no

 if (let name = optionalName) { 

Documentación de Apple (referencia de Swift):

El valor de la condición debe ser de tipo Bool o un tipo puenteado a Bool . La condición también puede ser una statement de enlace opcional, como se explica en Enlace opcional .

Siempre que trabaje con referencias débiles, tipos opcionales sería mejor usarlo si lo dejo para proteger su código de forma segura y evitar lockings. Aquí están los ejemplos.

 var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name } 

if solo toma expresiones booleanas, aparte de eso arrojaría un error, entonces este fragmento de código dice

 if let name = optionalName { }else{ } 

si optionalName es nil, entonces la condición es falsa y la instrucción else se ejecutará. Sin embargo, si optionalName tiene algún valor, entonces el valor opcional se desenvuelve / asigna a la variable constante, es decir, nombre.