Swift:if 条件周围的括号会发生什么变化?

Pet*_*mpf 5 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")
}
Run Code Online (Sandbox Code Playgroud)

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

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

有什么不同之处

if (let myUnwrappedObject = myOptionalObject) {
Run Code Online (Sandbox Code Playgroud)

if let myUnwrappedObject = myOptionalObject {
Run Code Online (Sandbox Code Playgroud)

?遗憾的是,文档没有提及 if 条件周围的大括号的效果。看来我需要使用无括号版本,但想更了解其中的原因。

Chr*_*örz 7

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

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

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


rin*_*aro 6

根据文件

\n\n

语句的语法if

\n\n
if [condition] {\n    [statements]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里[condition]定义为:

\n\n
\n

if-condition\xe2\x86\x92 expression\xc2\xad |value-binding-pattern\xc2\xad

\n
\n\n
\n\n

这里,let ...是一个“值绑定模式”

\n\n
\n

value-binding-pattern\xe2\x86\x92 var \xc2\xadpattern|\xc2\xad 让\xc2\xadpattern\xc2\xad

\n
\n\n

至于( ... ),它不是 avalue-binding-pattern因为它不以letnor开头var,因此它必须是一个表达式。在表达式规范中,我们唯一能找到以“开头”(和“结尾”的表达式),称为“括号表达式”

\n\n
\n

parenthesized-expression\xe2\x86\x92 ( \xc2\xadexpression-element-list\xc2\x采用\xc2\xad)\xc2\xad

\n
\n\n

expression-element-list基本上是一个逗号分隔的表达式列表。并且表达式不包括value-binding-pattern. 这就是为什么你不能在let ....

\n