¿Cuál es la diferencia entre precondition(condition: Bool, message: String)
y assert(condition: Bool, message: String)
en Swift?
Ambos me parecen iguales. ¿En qué contexto debemos usar uno sobre el otro?
assert
es para verificaciones de cordura durante las pruebas, mientras que precondition
es para protegerse contra cosas que, si suceden, significarían que su programa simplemente no podría continuar de manera razonable.
Entonces, por ejemplo, puede poner un assert
cálculo que tenga resultados razonables (dentro de algunos límites, por ejemplo), para encontrar rápidamente si tiene un error. Pero no querrá enviarlo con eso, ya que el resultado fuera del límite podría ser válido y no crítico, por lo que no debería bloquear su aplicación (suponga que solo la está usando para mostrar el progreso en una barra de progreso).
Por otro lado, comprobar que un subíndice en una matriz es válido cuando se busca un elemento es un precondition
. No hay una acción siguiente razonable que deba realizar el objeto de matriz cuando se le solicite un subíndice no válido, ya que debe devolver un valor no opcional.
Texto completo de los documentos (intente hacer clic en la opción assert
y precondition
en Xcode):
Condición previa
Compruebe una condición necesaria para avanzar.
Use esta función para detectar condiciones que deben evitar que el programa continúe incluso en el código de envío.
En patios de recreo y compilaciones -Onone (el valor predeterminado para la configuración de depuración de Xcode): si se
condition
evalúa como falso, detiene la ejecución del programa en un estado depurable después de la impresiónmessage
.En -O builds (el valor predeterminado para la configuración de lanzamiento de Xcode): si se
condition
evalúa como falso, detiene la ejecución del programa.En -Ounchecked construye,
condition
no se evalúa, pero el optimizador puede asumir que sería evaluar atrue
. No cumplir con esa suposición en las compilaciones no comprobadas es un error de programación grave.
Afirmar
Aserción tradicional de estilo C con un mensaje opcional.
Utilice esta función para las comprobaciones de cordura internas que están activas durante las pruebas pero que no afectan el rendimiento del código de envío. Para comprobar el uso no válido en las versiones de la versión; ver
precondition
.
En patios de recreo y compilaciones -Onone (el valor predeterminado para la configuración de depuración de Xcode): si se
condition
evalúa como falso, detiene la ejecución del programa en un estado depurable después de la impresiónmessage
.In -O builds (el valor predeterminado para la configuración de lanzamiento de Xcode),
condition
no se evalúa y no hay efectos.En -Ounchecked construye,
condition
no se evalúa, pero el optimizador puede asumir que sería evaluar atrue
. No cumplir con esa suposición en las compilaciones no comprobadas es un error de programación grave.
data["name"]
no existe, pero debería. Tener una aserción dentro de la guardia..else {} me ayudaría a detectar mi error al fallar y llevarme al problema. De manera similar, si este código estuviera en producción, la aserción no bloquearía el programa, y cualquier código de respaldo que usé (return nil
) se haría cargo.Encontré Swift afirma: el manual faltante es útil
Y de discusiones interesantes sobre Swift Evolution
Además, debe tener cuidado con lo que debe usar, consulte assertionFailure y Optimization Level
fuente
precondition()
ypreconditionFailure()
estamos teniendo los mismos comportamientos . La diferencia entre estas funciones es:precondition
necesita una condición en el interior, mientras quepreconditionFailure
simplemente se tira.El
precondition
está activo en el modo de lanzamiento, por lo que cuando envía su aplicación y falla la condición previa, la aplicación terminará.Assert
funciona solo en modo de depuración por defecto.Encontré esta gran explicación sobre cuándo usarlo en NSHipster:
fuente
Compruebe una condición necesaria para avanzar.
Aserción tradicional de estilo C con un mensaje opcional.
Utilice esta función para las comprobaciones de cordura internas que están activas durante las pruebas pero que no afectan el rendimiento del código de envío. Para comprobar el uso no válido en versiones de versiones; ver condición previa.
En patios de recreo y compilaciones -Onone (el valor predeterminado para la configuración de depuración de Xcode): si la condición se evalúa como falsa, detenga la ejecución del programa en un estado depurable después de imprimir el mensaje.
fuente