这是Swift中的有效代码:
println(nil < 1)
同样,输出也是如此
println(nil > 1)
将为false(数字1是任意的,您可以对-1执行相同操作,可能还有其他内容) . 我问的原因是因为我看到一些代码试图将 "some_string".toInt()
与数值进行比较并编译,这似乎是错误的,因为 toInt()
返回 Int?
.
My question is, should this be valid syntax in Swift? If so, what is the numeric value of nil?
Swift 3.0 Update:
看起来Swift Evolution通过removing the optional comparison operators解决了这个问题 . 这不再是Swift 3.0中的一个问题,因为它不能编译 .
1 回答
我相信正在发生的事情是,通过与
nil
的比较,文字1
被隐式地类型化为Int?
类型 . 对于那些没有进一步解释的人来说 . Swift有一个名为"optionals"的概念,它可以有一个值或者是nil
. (对于熟悉Haskell的人来说,这基本上就是Maybe
monad . )将nil
分配给未明确定义为可选的变量是非法的,因此编译器将拒绝let i: Int = nil
. 这允许多种好处超出了本答案的范围,而且这是一种相当聪明的方法 .但是,这里发生的是文字
1
是几种类型的有效值:Int
,Int32
,Int64
,UInt32
,UInt64
等等 . 它也是这些类型的可选版本的有效值 . :Int?
,Int32?
等因此,当Swift编译器看到文字值和
nil
之间的比较时,它会尝试查找这两个值都有效的类型 .1
是Int?
类型的有效值,nil
也是Int?
类型的有效值,因此它将比较运算符应用于类型签名(Int?, Int?) -> Bool
. (这是比较运算符,它接受两个Int?
值并返回Bool
) . 该运算符的规则表明nil
值的排序低于其他任何值,甚至Int.min
,因此您可以在OP的问题中看到结果 .