Дополнительный, по существу, перечисление с двумя возможными значениями либо назначенное значение, в вашем примере строка, или nil
. В вашем примере связка if let
не подпадает под номер Bool
. Вместо этого он проверяет, является ли переменная foo
nil
, а если она не nil
, тогда она устанавливает bar
равную foo
и выполняет код внутри блока. if let
связывания, таким образом, по существу, ярлык для
var foo: String?
if foo != nil {
//Set bar equal to the unwrapped value of foo
let bar = foo!
//Do whatever
}
Эффективность этого лучше всего показано в случае, если вы хотите проверить, если что-то nil
и проверить некоторую характеристику значения, если он не равен нулю. Скажем, вы хотели также проверить, что у foo
есть более 5 символов, и если он это делает, то что-то делать. Поскольку foo
может быть nil
, вам нужно будет проверить его специально, чтобы убедиться, что это не так. if let
связывание позволит вам сделать это:
if let bar = foo where bar.characters.count > 5 {
print(bar)
}
вместо этого:
if foo != nil && foo?.characters.count > 5 {
let bar = foo!
print(bar)
}
Это в основном делает очень читаемый, и, следовательно, более ремонтопригодны код. Кроме того, это мешает вам разворачивать опционально вручную (оператор !
в конце foo
).
Почему первый пример должен компилироваться в первую очередь? – Sulthan
Не совсем уверен, почему я получаю downvotes .. мой вопрос находится в SO руководящих принципов и действителен, поскольку я изучаю Swift. Tisk tisk вы спрашиваете нацистов. – milkcup
Это пример из руководства. Если бы быстро преобразовать значение выражения в тип Bool, то первый пример будет скомпилирован. Вот почему у меня возникла путаница в отношении второго примера. – milkcup