Respostas:
asserté para verificações de integridade durante o teste, enquanto preconditioné para proteger contra coisas que, se acontecerem, significariam que seu programa não poderia prosseguir razoavelmente.
Assim, por exemplo, você pode colocar um assertem algum cálculo com resultados razoáveis (dentro de alguns limites, digamos), para descobrir rapidamente se há um bug. Mas você não gostaria de enviar com isso, uma vez que o resultado fora do limite pode ser válido, e não crítico, portanto, não deve travar seu aplicativo (suponha que você estava apenas usando-o para exibir o progresso em uma barra de progresso).
Por outro lado, verificar se um subscrito em uma matriz é válido ao buscar um elemento é a precondition. Não há próxima ação razoável para o objeto de matriz executar quando solicitado por um subscrito inválido, pois ele deve retornar um valor não opcional.
Texto completo dos documentos (tente clicar em opções asserte preconditionno Xcode):
Condição prévia
Verifique uma condição necessária para avançar.
Use esta função para detectar condições que devem impedir o programa de prosseguir, mesmo no código de remessa.
Em playgrounds e builds -Onone (o padrão para a configuração de Debug do Xcode): se for
conditionavaliado como falso, interrompe a execução do programa em um estado depurável após a impressãomessage.Em compilações -O (o padrão para a configuração de lançamento do Xcode): se for
conditionavaliado como falso, interrompe a execução do programa.Em -Ounchecked constrói,
conditionnão é avaliado, mas o otimizador pode assumir que ele iria avaliar atrue. O não cumprimento dessa suposição em compilações -Ounchecked é um erro de programação sério.
Afirmar
O estilo C tradicional afirma com uma mensagem opcional.
Use esta função para verificações de integridade internas que estão ativas durante o teste, mas não afetam o desempenho do código de remessa. Para verificar o uso inválido em compilações de lançamento; veja
precondition.
Em playgrounds e builds -Onone (o padrão para a configuração de Debug do Xcode): se for
conditionavaliado como falso, interrompe a execução do programa em um estado depurável após a impressãomessage.Em builds -O (o padrão para a configuração de lançamento do Xcode),
conditionnão é avaliado e não há efeitos.Em -Ounchecked constrói,
conditionnão é avaliado, mas o otimizador pode assumir que ele iria avaliar atrue. O não cumprimento dessa suposição em compilações -Ounchecked é um erro de programação sério.
data["name"]não existe, mas deveria. Ter uma declaração dentro do guarda ... outro {} me ajudaria a detectar meu erro ao travar e me trazer ao problema. Da mesma forma, se esse código estivesse em produção, o assert não travaria o programa e qualquer código de backup que eu usei ( return nil) assumiria.
Achei afirmações do Swift - o manual que faltava pode ser ú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
E de discussões interessantes sobre o Swift Evolution
- assert: verificar se há erros internos em seu próprio código
- pré-condição: para verificar se seus clientes forneceram argumentos válidos.
Além disso, você precisa ter cuidado com o que usar, consulte assertionFailure e Nível de otimização
precondition()e preconditionFailure()está tendo os mesmos comportamentos . A diferença entre essas funções é: preconditionprecisa de uma condição dentro, enquanto preconditionFailureapenas joga fora.
O preconditionestá ativo no modo de liberação, portanto, quando enviar seu aplicativo e a condição prévia falhar, o aplicativo será encerrado.
Assertfunciona apenas no modo de depuração como padrão.
Encontrei esta ótima explicação quando usá-lo no NSHipster:
Asserções são um conceito emprestado da lógica clássica. Em lógica, asserções são declarações sobre proposições dentro de uma prova. Na programação, as asserções denotam as suposições que o programador fez sobre o aplicativo no local onde foram declaradas.
Quando usadas na capacidade de pré-condições e pós-condições, que descrevem as expectativas sobre o estado do código no início e no final da execução de um método ou função, as asserções formam um contrato. As asserções também podem ser usadas para impor condições em tempo de execução, a fim de evitar a execução quando certas condições prévias falham.
condição prévia
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Verifique uma condição necessária para avançar.
afirmar
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
O estilo C tradicional afirma com uma mensagem opcional.
Use esta função para verificações de integridade internas que estão ativas durante o teste, mas não afetam o desempenho do código de remessa. Para verificar o uso inválido em compilações de lançamento; veja a pré-condição.
Em playgrounds e builds -Onone (o padrão para a configuração de Debug do Xcode): se a condição for avaliada como falsa, pare a execução do programa em um estado depurável após imprimir a mensagem.