Eu vi esse código no site Swift e vários posts aqui e estou tentando entender o básico. Como esta linha é avaliada?
if let name = optionalName {
Estou confuso, pois não é nome == nome opcional, está atribuindo o valor, então como esse relatório é verdadeiro e por que não é verdadeiro quando você substitui por john appleseed por nil, já que ainda será igual?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
fonte
fonte
if let
sintaxe é conhecida como ligação opcional.Respostas:
Essencialmente, a linha está dizendo, "se você pode deixar a nova variável
name
igual à versão não opcional deoptionalName
, faça o seguinte com ela". Como Martin apontou, isso é chamado de vinculação opcional .O único propósito disso é testar se uma variável opcional contém um valor real e vincular a forma não opcional a uma variável temporária. Esta é a forma segura de "desembrulhar" um opcional ou, em outras palavras, acessar o valor contido no opcional. Não é de forma alguma um teste de igualdade de qualquer tipo. Ele está apenas testando a existência de um valor dentro de um opcional.
fonte
if let
, vinculamos o valor a uma variável não opcional (name
neste exemplo). Seu exemplo não compilou porque agora não há nenhuma variável chamadaname
. Se você alterasse seu exemplo para usá-optionalName
lo, seria impresso comoHello, Optional("John Appleseed")
. Você poderia usar o desempacotamento forçado após a verificação contra nil,Hello, \(optionalName!)
mas isso é mais sujeito a erros se você mover essa seção do código para algum lugar sem uma verificação.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.
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.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 //would not crash if you don't have a lead actor (optional chaining) let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)
Usar
if-let
(ouguard
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 umaelse
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
eif-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 } // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
fonte
A sintaxe if aceita 2 condições diferentes. A segunda, uma ligação opcional, não é booleana. Isso é confuso, pois você pode escrever:
if let name = optionalName {
mas não
if (let name = optionalName) {
Documentação da Apple (referência Swift):
fonte
if
só aceita expressões booleanas, exceto que geraria um erro, então este trecho de código dizendoif let name = optionalName { }else{ }
se optionalName for nulo, a condição será falsa e a instrução senão será executada. No entanto, se optionalName tiver algum valor, o valor opcional será desempacotado / atribuído à variável constante, ou seja, nome.
fonte
Sempre que você está trabalhando com referências fracas, tipos opcionais que seria melhor para uso , se deixar a guarda segura seu código e evitar acidentes Eis os exemplos
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
fonte