Qual é a diferença entre precondition(condition: Bool, message: String)
e assert(condition: Bool, message: String)
em Swift?
Ambos parecem iguais para mim. Em que contexto devemos usar um em vez do outro?
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 assert
em 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 assert
e precondition
no 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
condition
avaliado 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
condition
avaliado como falso, interrompe a execução do programa.Em -Ounchecked constrói,
condition
nã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
condition
avaliado 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),
condition
não é avaliado e não há efeitos.Em -Ounchecked constrói,
condition
nã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
E de discussões interessantes sobre o Swift Evolution
Além disso, você precisa ter cuidado com o que usar, consulte assertionFailure e Nível de otimização
fonte
precondition()
epreconditionFailure()
está tendo os mesmos comportamentos . A diferença entre essas funções é:precondition
precisa de uma condição dentro, enquantopreconditionFailure
apenas joga fora.O
precondition
está ativo no modo de liberação, portanto, quando enviar seu aplicativo e a condição prévia falhar, o aplicativo será encerrado.Assert
funciona apenas no modo de depuração como padrão.Encontrei esta ótima explicação quando usá-lo no NSHipster:
fonte
Verifique uma condição necessária para avançar.
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.
fonte