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 = booleanValueretorna falsese booleanValuefor nile o ifbloco não executa. Se booleanValuenão for nil, este código define uma nova variável chamada booleanValuede 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: Boolvariável. Se for verdade, o ifbloco é executado com a booleanValue: Boolvariável recém-definida no escopo (permitindo a opção de referenciar o valor vinculado novamente dentro do ifbloco).
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 falsenão é tão claro
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Nota: if !booleanValue ?? falsenã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á truedentro de uma ifinstruçã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.).