2016-09-26 2 views
6

Есть ли функциональное различие между:Являются ли несколько разрешений в инструкции охраны одинаковыми, как один?

guard let foo = bar, let qux = taco else { 
    ... 
} 

И:

guard let foo = bar, qux = taco else { 
    ... 
} 

Мне кажется, они же и дополнительные let не требуется?

+4

Второй вариант разрешен в Swift 2, но не больше в Swift 3. –

ответ

9

Они отличаются в Swift 3. В этом случае:

guard let foo = bar, let qux = taco else { 

вы говорите «необязательным UnWrap бар в обув. В случае успеха, необязательно разворачивать тако в qux.Если успешно продолжить. Else ... "

С другой стороны, это:

guard let foo = bar, qux = taco else { 

говорит «необязательным разворачивать бар в обув. Как логический, расценивает заявление присваивания qux = taco "Поскольку операторы присваивания не возвращать Booleans в Swift, это ошибка синтаксиса.

Это изменение позволяет гораздо более гибким guard заявления, так как вы можете перемешивать дополнительно развёртки и булевы по всей цепочке В Swift 2.2 вам пришлось развернуть все, а затем выполнить все булевы проверки в конце в предложении where (что иногда не позволяло выразить условие).

+0

Хорошо, хорошо знать. Очевидно, я все еще на скорости 2. У меня есть linter, который жалуется на первый синтаксис, который будет нуждаться в некоторых изменениях при обновлении. кс! –

+0

Сам Xcode 8 будет периодически отображать ошибку для этого, если вы работаете с Swift 2.3, затем он уходит на какой-то последний проход, который делает компилятор. – PeejWeej

6

В Swift 3.0 это не то же самое. Xcode дает вам ошибку и просит добавить let, когда вы применяете несколько переменных.

enter image description here

Таким образом, вы должны использовать

guard let foo = bar, let qux = taco else { 
    ... 
} 
Смежные вопросы