为什么在Swift中为可选变量赋值nil是正确的?
if var y : String? = nil { // Why is this true?
println("y is not nil")
}
但是,
var z : String? = nil
if z { // But this is false?
println("z is not nil")
}
答案 0 :(得分:3)
可选绑定的工作方式是检查分配是否成功。在这种情况下,因为您可以将nil分配给字符串?有用。
在第二个示例中,您只传递一个可选而不是赋值表达式。在这种情况下,它会检查可选项是否包含一个值,而不是。
答案 1 :(得分:3)
长话短说:这可能是一个nil的错误,它已经在Beta 3中得到修复。它现在是假的。
然而,你可能正在做一些与你想要的不同的事情。似乎还有另一个错误。
条件分配如下所示:
if (var|let) x : T = y : T? {
// this executes if y is not nil (T?.None), with x as its value
}
请注意,y的类型为T?
,而x的类型为T
。检查是y为零,而不是x ...
所以你要做的事情(除非你真的想使用String??
)是:
if var y : String = nil {
// this is false
}
但您的nil
被视为String??
,而不是String?
。
它可以用两种方式解释......
if let x: String? = String??.None {
// this is false, happens in Beta 3
}
if let x: String? = String??.Some(String?.None) {
// this is true, happens in Beta 2
}
您可以在游乐场中查看nil as String??
的值以确认这一点。
实际上具有讽刺意味的是,你评论中的另一个例子似乎与另一个错误有关,这个错误仍然存在于Beta 3中:
let NIL : String? = nil
NIL as String?? // this is String??.None
尽管String??
似乎无用且令人困惑,我仍然希望它是.Some(.None)
。
我会说这是一个错误。
答案 2 :(得分:2)
据我所知:
if var y : String? = nil {
println("y is not nil")
}
表示:
如果y
可能为nil
,请将y
设为nil
并打印
第二案:
var z : String? = nil
if z { // But this is false?
println("z is not nil")
}
我们知道z
是nil
=> if z
返回false
顺便说一句,如果你用非可选的方式写,你会得到false
:
if var y : String = nil { //returns false
println("y is not nil")
}