Дополнительная привязка
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?
и т. Д.).