鉴于
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
并失败。