¿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?
assertes para verificaciones de cordura durante las pruebas, mientras que preconditiones 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 assertcá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 asserty preconditionen 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
conditionevalú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
conditionevalúa como falso, detiene la ejecución del programa.En -Ounchecked construye,
conditionno 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
conditionevalú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),
conditionno se evalúa y no hay efectos.En -Ounchecked construye,
conditionno 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:preconditionnecesita una condición en el interior, mientras quepreconditionFailuresimplemente se tira.El
preconditionestá 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á.Assertfunciona 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