2015-02-12 4 views
1

Я пытаюсь справиться с Swift и как лучше всего разделить нулевые и действительные объекты от опционных.Swift: Что изменит скобки вокруг условия if?

У меня есть этот код:

var my AwesomeDict = [:]() 
... 
... (myAwesomeDict gets populated) 
... 
let myOptionalObject:objectClass? = myAwesomeDict[key] 
if let myUnwrappedObject = myOptionalObject { 
    ... 
} else { 
    println("Sorry, object is nil") 
} 

Когда я ставлю скобки, если п (я чувствую это улучшает читаемость), XCode пометит строку с ошибкой компилятора:

Pattern variable binding cannot appear in an expression

Что отличается о

if (let myUnwrappedObject = myOptionalObject) { 

из

if let myUnwrappedObject = myOptionalObject { 

? К сожалению, в документации не упоминается эффект брекетов вокруг, если условия. Кажется, мне нужно использовать версию без кронштейна, но хотелось бы получить больше информации о причине.

ответ

3

По the document:

Синтаксис if утверждения

if [condition] { 
    [statements] 
} 

И [condition] здесь определяется как:

if-conditionexpression ­ | value-binding-pattern­


Здесь let ... является "Value-Binding Pattern".

value-binding-pattern → var ­pattern |­ let ­pattern ­

Что касается (...), это не value-binding-pattern, потому что он не начинается с let ни var, следовательно, он должен быть выражением. В спецификациях выражений единственное, что мы можем найти, которое начинается с ( и заканчивается ), называется "Parenthesized Expression".

parenthesized-expression → ( ­expression-element-list­opt ­)­

expression-element-list в основном запятыми список выражений. И выражение не включает value-binding-pattern. Вот почему вы не можете поставить скобки вокруг let ....

4

Ну вот, if let - это сам образец. Поэтому, если вы помещаете скобки между if и let, вы нарушаете шаблон.

Если вы это сделаете, Swift думает, что вы хотите проверить сам let.

Так просто сказал: Если вы используете if let, не используйте скобки, потому что он разбивает шаблон if let.

+0

Я понял, что ваш ответ легче понять, но должен признать, что я узнал больше из ответа @ rintaro. Я замял, какой из них принять и, наконец, решил за него. –

+0

Нет проблем. Я бы тоже принял его ответ. :) – Christian

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