Um opcional é definido ou não definido (não nil ou nil) ... deixando-nos com uma decisão importante. “Como devemos escrever nosso código para que funcione corretamente para 2 ambos os estados?”. A maneira como desembrulhamos o opcional é o que decide isso para nós.
Existem várias abordagens que você pode usar para combater um opcional não definido.
- Batida!
- O valor padrão é algo - se não foi definido.
- Falha graciosamente, ou seja, não faça nada, mas também se o valor foi definido, atribua-o.
- Falha graciosamente, ou seja, não faça nada, no entanto, se o valor foi definido ... faça algo (é apenas mais do que uma única atribuição).
Abaixo estão as 4 abordagens
Usar o desembrulhamento forçado irá travar se você não tiver um valor. Você gostaria de fazer isso se ter esse valor for de vital importância, por exemplo, o título de um filme (todo filme DEVE ter um nome). !
é usado para desembrulhar forçado.
movieTitle = movie.title!
Usar a coalescência nil é outra maneira que lhe dará mais controle , o que significa que não irá travar se o valor não for definido, nem "não definirá nada" se não for definido ... faria o que você disser para fazer, por exemplo, definiria / definiria o nome do filme como untitled_movie se não houvesse nenhum nome definido. ??
é usado para coalescência nula.
var movieTitle = movie.title ?? "untitled_Movie"
Usar o encadeamento opcional não fará nada se você não tiver um valor e irá definir o valor se você tiver um valor. Você faz isso para algo cujo valor definido não é de vital importância, por exemplo, para o nome do agente do seu ator . ?
é usado para encadeamento opcional.
let agent = movie.leadActor?.agent
let agent = movie.leadActor!.agent
Usar if-let
(ou guard
que são dois tipos diferentes de vinculação opcional ) lhe dará mais controle , não travará se o valor não for definido. Se o valor estiver definido, você pode fazer algo. Se não estiver definido, você pode adicionar uma else
declaração.
if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
Esta é a forma mais comumente usada de desembrulhar, pois o desembrulhamento forçado é um pouco desencorajado. Para mais discussão sobre por que isso é desencorajado, veja aqui . Para uma boa comparação entre guard
e if-let
vejaguard vs. if-let
Nota:
Encadernação opcional e encadeamento opcional são comumente usados juntos:
if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
}