Ligação opcional
Swift 3 e 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Swift 2.2
var booleanValue : Bool? = false
if let booleanValue = booleanValue where booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
O código let booleanValue = booleanValue
retorna false
se booleanValue
for nil
e o if
bloco não executa. Se booleanValue
não for nil
, este código define uma nova variável chamada booleanValue
de tipo Bool
(em vez de opcional, Bool?
).
O código Swift 3 e 4 booleanValue
(e código Swift 2.2 where booleanValue
) avalia a nova booleanValue: Bool
variável. Se for verdade, o if
bloco é executado com a booleanValue: Bool
variável recém-definida no escopo (permitindo a opção de referenciar o valor vinculado novamente dentro do if
bloco).
Nota: É uma convenção do Swift nomear a constante / variável associada da mesma forma que a constante / variável opcional, como let booleanValue = booleanValue
. Essa técnica é chamada de sombreamento variável . Você pode quebrar as convenções e usar algo assim let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue
. Eu aponto isso para ajudar a entender o que está acontecendo. Eu recomendo usar sombreamento variável.
Outras Abordagens
Nil coalescendo
A coalescência nula é clara para este caso específico
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Verificar false
não é tão claro
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Nota: if !booleanValue ?? false
não compila.
Forçar desembrulhar opcional (evitar)
Forçar o desempacotamento aumenta a chance de que alguém faça uma alteração no futuro que compila, mas falha durante a execução. Portanto, eu evitaria algo assim:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Uma abordagem geral
Embora esta questão de estouro de pilha pergunte especificamente como verificar se a Bool?
está true
dentro de uma if
instrução, é útil identificar uma abordagem geral, seja verificando verdadeiro, falso ou combinando o valor não encapsulado com outras expressões.
À medida que a expressão fica mais complicada, acho a abordagem de vinculação opcional mais flexível e fácil de entender do que outras abordagens. Nota que as obras de ligação opcionais com qualquer tipo opcional ( Int?
, String?
, etc.).