Respuestas:
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
debug release release
function -Onone -O -Ounchecked
assert() YES NO NO
assertionFailure() YES NO NO**
precondition() YES YES NO
preconditionFailure() YES YES YES**
fatalError()* YES YES YES
Y de discusiones interesantes sobre Swift Evolution
- afirmar: verificar su propio código para detectar errores internos
- condición previa: para comprobar que sus clientes le han dado argumentos válidos.
Además, debe tener cuidado con lo que debe usar, consulte assertionFailure y Optimization Level
precondition()
y preconditionFailure()
estamos teniendo los mismos comportamientos . La diferencia entre estas funciones es: precondition
necesita una condición en el interior, mientras que preconditionFailure
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:
Las afirmaciones son un concepto tomado de la lógica clásica. En lógica, las afirmaciones son declaraciones sobre proposiciones dentro de una prueba. En programación, las afirmaciones denotan suposiciones que el programador ha hecho sobre la aplicación en el lugar donde se declaran.
Cuando se utilizan en la capacidad de precondiciones y poscondiciones, que describen expectativas sobre el estado del código al principio y al final de la ejecución de un método o función, las afirmaciones forman un contrato. Las afirmaciones también se pueden utilizar para hacer cumplir las condiciones en tiempo de ejecución, con el fin de evitar la ejecución cuando fallan ciertas condiciones previas.
condición previa
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Compruebe una condición necesaria para avanzar.
afirmar
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
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.