2016-07-04 2 views
-3

Почему эта переменная i не заменяет Bool, но необязательное связывание? Swift утверждает, что это в руководстве ..Почему необязательная привязка оценивает тип Bool?

Swift’s type safety prevents non-Boolean values from being substituted for Bool. The following example reports a compile-time error:

let i = 1 
if i { 
    // this example will not compile, and will report an error 
} 

Однако это составляет

var foo: String? 

if let bar = foo { 
    print("Non nil") 
} 
+0

Почему первый пример должен компилироваться в первую очередь? – Sulthan

+0

Не совсем уверен, почему я получаю downvotes .. мой вопрос находится в SO руководящих принципов и действителен, поскольку я изучаю Swift. Tisk tisk вы спрашиваете нацистов. – milkcup

+0

Это пример из руководства. Если бы быстро преобразовать значение выражения в тип Bool, то первый пример будет скомпилирован. Вот почему у меня возникла путаница в отношении второго примера. – milkcup

ответ

2

Дополнительный, по существу, перечисление с двумя возможными значениями либо назначенное значение, в вашем примере строка, или nil. В вашем примере связка if let не подпадает под номер Bool. Вместо этого он проверяет, является ли переменная foonil, а если она не 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).

+0

Спасибо. Основная путаница, которую я имел, заключалась в том, что результат установки константы в значение развернутых необязательных действий, как если бы выражение оценивалось как true и выполняло блок кода. Хотя выражения не оцениваются в Bool в Swift. Возможно, я просто отсталый, но в отношении заявления, которое я цитировал из документации, это просто казалось. – milkcup

Смежные вопросы