【问题标题】:Swift: What do brackets around an if condition change?斯威夫特: if 条件周围的括号会发生什么变化?
【发布时间】:2015-02-12 10:45:31
【问题描述】:

我尝试掌握 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 {

?可悲的是,文档没有提到 if 条件周围大括号的影响。看来我需要使用无括号版本,但想了解原因。

【问题讨论】:

    标签: xcode swift


    【解决方案1】:

    这里,if let 本身就是一种模式。所以如果你在 if 和 let 之间放一个括号,你就打破了这个模式。

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

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

    【讨论】:

    • 我发现您的答案更容易理解,但必须承认我从@rintaro 的答案中学到了更多。我犹豫着接受哪一个,最后决定接受他。
    • 没问题。我也会接受他的回答。 :)
    【解决方案2】:

    根据the document

    if语句的语法是

    if [condition] {
        [statements]
    }
    

    [condition]这里定义为:

    if-conditionexpression | value-binding-pattern­


    这里,let ..."Value-Binding Pattern"

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

    至于( ... ),它不是value-binding-pattern,因为它不是以let开头,也不是var,因此它必须是一个表达式。在表达式的规范中,我们唯一能找到的以( 开头并以) 结尾的称为"Parenthesized Expression"

    parenthesized-expression → (­expression-element-listopt)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多