这是Swift中的有效代码:
println(nil < 1)
输出也是如此
println(nil > 1)
将是假的(数字1是任意的,你可以做同样的-1,可能还有别的)。我问的原因是因为我看到一些代码,试图将“some_string”.toInt()与一个数值进行比较,并且它被编译,考虑到Int()返回Int?似乎是错误的。
我的问题是,Swift应该是有效的语法吗?如果是这样,nil的数值是多少?
Swift 3.0更新:
看起来像Swift Evolution在removing the optional comparison operators处理这个问题。这不再是Swift 3.0的问题,因为它不编译。
我相信发生了什么是文字1是Int的隐含的类型?类型比较为零。对于那些不习惯Swift的人,我会进一步解释一下。 Swift有一个名为“可选”的概念,它可以是一个值,也可以是零。 (对于熟悉Haskell的人来说,这基本上是Maybe monad。)将nil分配给一个没有被明确定义为可选的变量是非法的,所以让我:Int = nil将被编译器拒绝。这允许在这个答案的范围之外的几个好处,这是一个相当聪明的方式来做到这一点。
这里发生的是,文字1是几种类型的有效值:Int,Int32,Int64,UInt32,UInt64等等。它也是这些类型的可选版本的有效值:Int?,Int32?等
所以当Swift编译器看到一个文字值和零之间的比较时,它会尝试找到一个这两个值对它有效的类型。 1是Int的有效值? type,而nil也是Int的有效值?类型,因此它将比较运算符与类型签名(Int?Int?)→>布尔。 (这是比较运算符,它需要两个Int?值并返回一个Bool)。该运算符的规则表明,零价值比其他任何数值都低,即使是Int.min,所以你得到OP的问题看到的结果。