Swift:如果条件改变,括号是什么?

时间:2015-02-12 10:45:32

标签: xcode swift

我试图掌握Swift,以及如何最好地从选项中分离nil和有效对象。

我有这段代码:

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

当我在if子句周围放置括号(我觉得它提高了可读性)时,XCode会用编译器错误标记该行:

  

模式变量绑定不能出现在表达式

有什么不同
if (let myUnwrappedObject = myOptionalObject) {

if let myUnwrappedObject = myOptionalObject {

?可悲的是,文档没有提到条件的支撑效果。我似乎需要使用无支架版本,但希望对原因更加开明。

2 个答案:

答案 0 :(得分:4)

在这里,if let本身就是一种模式。因此,如果在if和let之间放置一个括号,则会破坏模式。

如果你这样做,Swift认为你想检查let本身。

所以简单地说:如果你使用if let,请不要使用括号,因为它会破坏if let模式。

答案 1 :(得分: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 ...附近放置括号。