Swift中快捷方式可选绑定语法的等价性

时间:2014-10-02 22:05:16

标签: swift conditional-statements assign optional

鉴于

var maybeInt: Int?

如何将以下两个条件语句区别开来?

// (1)
if let y = maybeInt {
    y
} else {
    println("Nope")
}

// (2)
if let y = maybeInt? {
    y
} else {
    println("Nope")
}

他们似乎表现完全一样。前者是否是后者的捷径?

1 个答案:

答案 0 :(得分:4)

第二种语法是可选的链接 - 在链接运算符之后没有任何内容。它访问前面的任何可选项(如果可选项不是nil),允许对可选项的内容进行链接属性访问或方法调用,并将结果包装在可选项中。将它放入if let unwraps可选。

换句话说,第二种语法中的附加?实际上是无操作。


但是,尽管它在您的示例中没有任何效果,?本身仍在进行可选链接,您可以看到

if let y: Int? = maybeInt {
    y
} else {
    println("Nope")
}

if let y: Int? = maybeInt? {
    y
} else {
    println("Nope")
}

导致

nil
"Nope"

因为虽然maybeInt? == maybeInt - 上面意义上的“无操作” - (以及nilInt?的分配有效)但第二个表达式会遇到nil关于maybeInt的可选链接并失败。