为什么在Swift中将nil分配给可选变量是正确的?

时间:2014-07-12 11:17:30

标签: swift null optional

为什么在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")
}

3 个答案:

答案 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")
}

我们知道znil => if z返回false

顺便说一句,如果你用非可选的方式写,你会得到false

if var y : String = nil { //returns false
    println("y is not nil")
}