鉴于

var maybeInt: Int?

以下两个条件语句如何不同?
// (1)
if let y = maybeInt {
    y
} else {
    println("Nope")
}

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

他们的行为似乎一模一样。前者是后者的捷径吗?

最佳答案

第二种语法是可选的链接-只是链接操作符后面没有任何内容。它访问它前面的任何可选内容(如果可选内容不是nil),允许对可选内容进行链接属性访问或方法调用,并将结果包装为可选内容。把它放进一个if let打开这个选项。
换句话说,第二个语法中的附加?实际上是这里的no op。
然而,尽管它在您的示例中没有任何效果,但是?本身仍然在执行可选链接,如您所见

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

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

结果是
nil
"Nope"

因为当maybeInt? == maybeInt-一个“no op”时,在上面的意义上(并且将nil赋值给Int?起作用),第二个表达式在nil的可选链接上遇到maybeInt并失败。

10-06 07:07