Alguma perspectiva geral para adicionar a outras respostas úteis, mas mais centradas em detalhes:
No Swift, o ponto de exclamação aparece em vários contextos:
- Desembrulhamento forçado:
let name = nameLabel!.text
- Opcionais implicitamente desembrulhados:
var logo: UIImageView!
- Fundição forçada:
logo.image = thing as! UIImage
- Exceções não tratadas:
try! NSJSONSerialization.JSONObjectWithData(data, [])
Cada uma delas é uma construção de linguagem diferente, com um significado diferente, mas todas elas têm três coisas importantes em comum:
1. Os pontos de exclamação contornam as verificações de segurança em tempo de compilação do Swift.
Quando você usa o !
Swift, está basicamente dizendo: “Ei, compilador, eu sei que você acha que um erro pode acontecer aqui, mas eu sei com total certeza que isso nunca acontecerá".
Nem todo código válido se encaixa na caixa do sistema de tipos de tempo de compilação do Swift - ou na verificação estática de qualquer tipo de idioma, nesse caso. Há situações em que você pode provar logicamente que nunca ocorrerá um erro, mas não o poderá provar ao compilador . É por isso que os designers da Swift adicionaram esses recursos em primeiro lugar.
No entanto, sempre que você usa !
, está descartando um caminho de recuperação para um erro, o que significa que…
2. Pontos de exclamação são possíveis falhas.
Um ponto de exclamação também diz: "Hey Swift, tenho tanta certeza de que esse erro nunca pode acontecer que é melhor você travar meu aplicativo inteiro do que codificar um caminho de recuperação para ele".
Essa é uma afirmação perigosa. ele pode ser o correto: no código de missão crítica, onde você tem pensado muito sobre invariantes do seu código, pode ser que a saída falsa é pior do que um acidente.
No entanto, quando vejo !
na natureza, raramente é usado com tanta atenção. Em vez disso, muitas vezes significa: "esse valor era opcional e eu realmente não pensei muito sobre por que poderia ser nulo ou como lidar adequadamente com essa situação, mas a adição !
fez com que fosse compilada ... para que meu código esteja correto, certo?"
Cuidado com a arrogância do ponto de exclamação. Em vez de…
3. Os pontos de exclamação são melhor usados com moderação.
Cada uma dessas !
construções possui uma ?
contraparte que o força a lidar com o caso de erro / zero:
- Desempacotamento condicional:
if let name = nameLabel?.text { ... }
- Opcionais:
var logo: UIImageView?
- Elenco condicional:
logo.image = thing as? UIImage
- Exceções de zero em falha:
try? NSJSONSerialization.JSONObjectWithData(data, [])
Se você é tentado a usar !
, é sempre bom considerar cuidadosamente por que você não está usando ?
. Falhando no seu programa é realmente a melhor opção se a !
operação falhar? Por que esse valor é opcional / disponível?
Existe um caminho de recuperação razoável que seu código poderia seguir no caso de nulo / erro? Se sim, codifique-o.
Se não puder ser nulo, se o erro nunca ocorrer, existe uma maneira razoável de refazer sua lógica para que o compilador saiba disso? Se sim, faça; seu código será menos propenso a erros.
Há momentos em que não há uma maneira razoável de lidar com um erro, e simplesmente ignorá-lo - e, assim, prosseguir com dados errados - seria pior do que travar. Esses são os momentos para usar a força de desembrulhar.
Eu procuro periodicamente toda a minha base de código !
e audito cada uso dela. Muito poucos usos resistem ao escrutínio. (Até o momento em que este artigo foi escrito, toda a estrutura do Siesta possui exatamente duas instâncias .)
Isso não quer dizer que você nunca deve usar !
seu código - apenas que você deve usá-lo com atenção e nunca torná-lo a opção padrão.