Необов’язковий переплет
Свіфт 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?
і т.д.).