He estado leyendo acerca de los opcionales en Swift, y he visto ejemplos en los que if let
se usa para verificar si un Opcional tiene un valor y, en caso de que lo haga, haga algo con el valor sin envolver.
Sin embargo, he visto que en Swift 2.0 la palabra clave guard let
se usa principalmente. Me pregunto si if let
se ha eliminado de Swift 2.0 o si todavía se puede usar.
¿Debo cambiar mis programas que contienen if let
a guard let
?
fuente
if let
cuando elnon-nil
caso sea válido. Úseloguard
cuando elnil
caso representa algún tipo de error.guard
es apropiado incluso si no hay error. A veces solo significa que no hay nada que hacer. Por ejemplo, unpositionTitle
método podríaguard if let title = title else {return}
. El título puede ser opcional, en cuyo caso esto no es un error. Peroguard let
sigue siendo apropiado.if let
solo es visible dentro delif let
alcance. La variable enlazada porguard let
es visible después. Por lo tanto, tiene sentido usar guard para enlazar valores opcionales también.Guardia puede mejorar la claridad
Cuando usa guardia, tiene una expectativa mucho mayor de que el guardia tenga éxito y es algo importante que si no tiene éxito, entonces solo desea salir del alcance antes de tiempo . Al igual que guarda para ver si existe un archivo / imagen, si una matriz está vacía o no.
Si escribe el código anterior con if-let, transmite al desarrollador de lectura que es más de un 50-50. Pero si usa guardia, agrega claridad a su código e implica que espero que funcione el 95% del tiempo ... si alguna vez falla, no sé por qué lo haría; es muy poco probable ... ¡pero simplemente use esta imagen predeterminada en su lugar o tal vez simplemente afirme con un mensaje significativo que describa lo que salió mal!
Además, como resultado de las sugerencias anteriores y el código limpio, es más probable que desee / necesite agregar aserciones en las declaraciones de protección fallidas , solo mejora la legibilidad y deja en claro a otros desarrolladores lo que esperaba.
(no utilizará afirmaciones / condiciones previas para
if-let
s. Simplemente no parece correcto)El uso de guardias también te ayuda a mejorar la claridad al evitar la pirámide de la fatalidad. Ver la respuesta de Nitin .
Guard crea una nueva variable
Hay una diferencia importante que creo que nadie ha explicado bien.
Tanto
guard let
yif let
Separar la variable embargoCon
guard let
usted está creando una nueva variable que existirá fuera de laelse
declaración.Si
if let
no está creando ninguna variable nueva, después de la instrucción else, solo ingresa el bloque de código si el opcional no es nulo. ¡La variable recién creada existe solo dentro del bloque de código, no después!guard let:
if-let:
Para obtener más información
if let
, consulte: ¿Por qué la redeclaración de enlace opcional no crea un error?Guardia requiere alcance salir
(También mencionado en la respuesta de Rob Napier):
DEBE haber
guard
definido dentro de una función. Su propósito principal es abortar / devolver / salir del alcance, si no se cumple una condición:Para
if let
que no necesite tenerlo dentro de ninguna función:guard
vsif
Vale la pena señalar que es más apropiado para ver esta cuestión como
guard let
vsif let
yguard
vsif
.Un independiente
if
no hace ningún desenvolvimiento, tampoco lo hace un independienteguard
. Ver ejemplo a continuación. No sale temprano si un valor esnil
. NO hay valores opcionales. Simplemente sale temprano si no se cumple una condición.fuente
Cuándo usar
if-let
y cuándo usarguard
es a menudo una cuestión de estilo.Supongamos que tiene
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
una matriz opcional de elementos (var optionalArray: [SomeType]?
), y debe devolver0
si la matriz estánil
(no establecida) ocount
si la matriz tiene un valor (está establecida).Puede implementarlo así usando
if-let
:o así usando
guard
:Los ejemplos son funcionalmente idénticos.
Donde
guard
realmente brilla es cuando tienes una tarea como validar datos, y quieres que la función falle temprano si algo está mal.En lugar de anidar un montón de
if-let
s a medida que se acerca a la finalización de la validación, la "ruta de éxito" y las opcionales ahora vinculadas con éxito están en el alcance principal del método, porque las rutas de falla ya han regresado.fuente
Trataré de explicar la utilidad de las declaraciones de guardia con algún código (no optimizado).
Tiene una IU donde está validando campos de texto para el registro de usuarios con nombre, apellido, correo electrónico, teléfono y contraseña.
Si algún textField no contiene texto válido, debe hacer que ese campo sea FirstResponder.
Aquí está el código no optimizado:
Puede ver arriba, que todas las cadenas (firstNameString, lastNameString, etc.) son accesibles solo dentro del alcance de la instrucción if. por lo que crea esta "pirámide de la fatalidad" y tiene muchos problemas, incluida la legibilidad y la facilidad para mover las cosas (si se altera el orden de los campos, debe reescribir la mayor parte de este código)
Con la declaración de protección (en el código a continuación), puede ver que estas cadenas están disponibles fuera de
{}
y se utilizan, si todos los campos son válidos.Si cambia el orden de los campos, simplemente mueva las líneas de código respectivas hacia arriba o hacia abajo, y estará listo para comenzar.
Esta es una explicación muy simple y un caso de uso. ¡Espero que esto ayude!
fuente
Diferencia básica
Guardia deja
si deja
NOTA: Ambos se usan para desenvolver la variable Opcional.
fuente
La explicación más clara que vi fue en la Guía de estilo Github Swift :
if
agrega un nivel de profundidad:guard
no:fuente
Guardia
Una declaración de guardia tiene la siguiente forma:
si deja
fuente
Aprendí esto de Swift con Bob ...
Si no típico
Problemas con Else-If
Declaración de protección Un bloque de protección solo se ejecuta si la condición es falsa, y saldrá de la función mediante retorno. Si la condición es verdadera, Swift ignora el bloqueo. Proporciona una salida anticipada y menos paréntesis.
Desenvuelva los opcionales con otra opción
Una declaración de protección no solo es útil para reemplazar un bloque condicional típico con una declaración else-if, sino que también es excelente para desenvolver opciones al minimizar el número de paréntesis. Para comparar, primero comencemos a desenvolver múltiples opcionales con else-if. Primero, creemos tres opciones que se desenvolverán.
La peor pesadilla
El código anterior ciertamente funciona pero viola el principio DRY. Es atroz Vamos a desglosarlo. +
Ligeramente mejor El siguiente código es más legible que el anterior.
Desenvolver con Guardia Las declaraciones else-if pueden reemplazarse con guard.
Desenvuelva múltiples opcionales con Else-If Hasta ahora, ha estado desenvolviendo opcionales uno por uno. Swift nos permite desenvolver múltiples opciones a la vez. Si uno de ellos contiene nil, ejecutará el bloque else.
Desenvolver múltiples opcionales con Guardia Por supuesto, deberíamos usar guard sobre over-if. +
fuente