鉴于
var maybeInt: Int?
如何将以下两个条件语句区别开来?
// (1)
if let y = maybeInt {
y
} else {
println("Nope")
}
// (2)
if let y = maybeInt? {
y
} else {
println("Nope")
}
他们似乎表现完全一样。前者是否是后者的捷径?
答案 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
- 上面意义上的“无操作” - (以及nil
对Int?
的分配有效)但第二个表达式会遇到nil
关于maybeInt
的可选链接并失败。