Дополнительная привязка
Swift 3 и 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)'")
}
Код let booleanValue = booleanValueвозвращается, falseесли booleanValueесть, nilи ifблок не выполняется. Если booleanValueнет nil, этот код определяет новую переменную с именем booleanValueтипа Bool(вместо необязательного, Bool?).
Код Swift 3 и 4 booleanValue(и код Swift 2.2 where booleanValue) оценивает новую booleanValue: Boolпеременную. Если это правда, ifблок выполняется с вновь определенной booleanValue: Boolпеременной в области видимости (позволяя опции снова ссылаться на связанное значение внутри ifблока).
Примечание. В соответствии с соглашением Swift связанная константа / переменная называется так же, как необязательная константа / переменная, например let booleanValue = booleanValue. Этот прием называется переменным затенением . Вы можете отказаться от условностей и использовать что-то вроде let unwrappedBooleanValue = booleanValue, unwrappedBooleanValue. Я указываю на это, чтобы помочь понять, что происходит. Я рекомендую использовать переменное затенение.
Другие подходы
Нулевое слияние
Отсутствие коалесценции очевидно для этого конкретного случая
var booleanValue : Bool? = false
if booleanValue ?? false {
print("optional booleanValue: '\(booleanValue)'")
}
Проверка falseне так ясна
var booleanValue : Bool? = false
if !(booleanValue ?? false) {
print("optional booleanValue: '\(booleanValue)'")
}
Примечание: if !booleanValue ?? falseне компилируется.
Принудительное разворачивание необязательно (избегать)
Принудительное развертывание увеличивает вероятность того, что в будущем кто-то внесет изменение, которое компилируется, но дает сбой во время выполнения. Поэтому я бы избегал такого:
var booleanValue : Bool? = false
if booleanValue != nil && booleanValue! {
print("optional booleanValue: '\(booleanValue)'")
}
Общий подход
Хотя этот вопрос о переполнении стека конкретно спрашивает, как проверить, находится ли a Bool?в trueпределахif заявления, полезно определить общий подход ли проверка на истинный, ложный или комбинируя развернутое значение с другими выражениями.
По мере усложнения выражения я считаю необязательный подход связывания более гибким и легким для понимания, чем другие подходы. Обратите внимание, что дополнительная привязка работает с любым дополнительным типом ( Int?, String?и т. Д.).