为什么在 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")
}
最佳答案
长话短说:它可能是 nil 的一个错误,它在 Beta 3 中已修复。现在它是 false。
不过,您可能正在做一些与您想做的不同的事情。而且似乎还有另一个错误。
条件赋值看起来像这样:
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
}
您可以在 playground 中检查 nil as String??
的值来确认这一点。
真正具有讽刺意味的是,您的评论中的另一个示例似乎与另一个错误有关,该错误仍然存在于 Beta 3 中:
let NIL : String? = nil
NIL as String?? // this is String??.None
尽管 String??
看起来无用且令人困惑,但我仍然希望它是 .Some(.None)
。
我会说这是一个错误。
关于swift - 为什么在 Swift 中将 nil 分配给可选变量是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712371/