这是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中的一个问题,因为它没有编译。
答案 0 :(得分:17)
我相信正在发生的事情是文字1
通过与Int?
的比较隐式地对nil
类型进行了类型转换。对于那些不习惯Swift的人,我会进一步解释一下。 Swift有一个名为&#34; optionals&#34;的概念,它可以有一个值或nil
。 (对于熟悉Haskell的人来说,这基本上是Maybe
monad。)将nil
分配给未明确定义为可选的变量是非法的,因此{{1将被编译器拒绝。这可以带来一些超出本答案范围的好处,而且这是一种相当聪明的方法。
这里发生的事情是,文字let i: Int = nil
是几种类型的有效值:1
,Int
,Int32
,{{ 1}},Int64
等等,并且 这些类型的可选版本的有效值:UInt32
,{ {1}}等等。
因此,当Swift编译器看到文字值与UInt64
之间的比较时,它会尝试查找这两个值都有效的类型。 Int?
是Int32?
类型的有效值,nil
也是1
类型的有效值,因此它将比较运算符应用于类型签名{{ 1}}。 (这是比较运算符,它接受两个Int?
值并返回nil
)。该运算符的规则表明,Int?
值的排序低于其他任何值,甚至(Int?, Int?) -> Bool
,因此您可以在OP的问题中看到结果。