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

标签 swift null option-type

为什么在 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/

相关文章:

快速委派

ios - 快速从 TableViewCell 获取 TableView 部分标题

json - 如何将变量的值保留在函数之外?

sql-server - 在 SQL Server 的 OPENXML 函数中将空元素视为空值

Swift:如果不等于nil则设置变量

.net - 何时在 F# 中引发 nullArg

ios - El capitane 上的 Xcode 6.2 - Storyboard编译器错误 : Exception while running ibtool

c# - 检查 Console.ReadLine()!=null

ruby - 这里的 nil 是什么意思/代表什么?

haskell - 使用 Maybe 返回函数映射和过滤 Maybe 列表