Swift nil有数值吗?

时间:2014-10-03 03:30:55

标签: swift optional

这是Swift中的有效代码:

println(nil < 1)

输出将是真的,同样

println(nil > 1)

将为false(数字1是任意的,您可以对-1执行相同操作,可能还有其他内容)。我问的原因是因为我看到一些代码试图将"some_string".toInt()与数值进行比较并进行编译,考虑到toInt()返回Int?,这似乎是错误的。

我的问题是,这应该是Swift中的有效语法吗?如果是这样,nil的数值是什么?


Swift 3.0更新:

看起来Swift Evolution通过removing the optional comparison operators解决了这个问题。这不再是Swift 3.0中的一个问题,因为它没有编译。

1 个答案:

答案 0 :(得分:17)

我相信正在发生的事情是文字1通过与Int?的比较隐式地对nil类型进行了类型转换。对于那些不习惯Swift的人,我会进一步解释一下。 Swift有一个名为&#34; optionals&#34;的概念,它可以有一个值或nil。 (对于熟悉Haskell的人来说,这基本上是Maybe monad。)将nil分配给未明确定义为可选的变量是非法的,因此{{1将被编译器拒绝。这可以带来一些超出本答案范围的好处,而且这是一种相当聪明的方法。

这里发生的事情是,文字let i: Int = nil是几种类型的有效值:1IntInt32,{{ 1}},Int64等等,并且 这些类型的可选版本的有效值:UInt32,{ {1}}等等。

因此,当Swift编译器看到文字值与UInt64之间的比较时,它会尝试查找这两个值都有效的类型。 Int?Int32?类型的有效值,nil也是1类型的有效值,因此它将比较运算符应用于类型签名{{ 1}}。 (这是比较运算符,它接受两个Int?值并返回nil)。该运算符的规则表明,Int?值的排序低于其他任何值,甚至(Int?, Int?) -> Bool,因此您可以在OP的问题中看到结果。