Необов’язковий переплет
Свіфт 3 і 4
var booleanValue : Bool? = false
if let booleanValue = booleanValue, booleanValue {
print("bound booleanValue: '\(booleanValue)'")
}
Свіфт 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?і т.д.).