这是Swift中的有效代码:
println(nil < 1)
同样,输出将为真
println(nil > 1)
将为假(数字1是任意的,您可以对-1进行相同的操作,可能还可以进行其他操作)。我问的原因是因为我看到一些试图将"some_string".toInt()其与数字值进行比较的代码并将其编译,考虑toInt()return 似乎是错误的Int?。
"some_string".toInt()
toInt()
Int?
我的问题是,在Swift中这应该是有效的语法吗? 如果是这样,nil的数值是多少?
Swift 3.0更新:
看起来Swift Evolution通过删除可选的比较运算符解决了这个问题。在Swift 3.0中,由于它无法编译,因此不再是一个问题。
我相信正在发生的事情是,通过与比较,1隐式地将文字转换为该Int?类型nil。对于那些不习惯Swift的人,我将进一步解释。Swift有一个称为“可选”的概念,可以有一个值或为nil。(对于熟悉Haskell的人来说,这基本上是Maybemonad。)将nil变量赋给未明确定义为可选的变量是非法的,因此let i: Int = nil将被编译器拒绝。这带来了一些超出此答案范围的好处,这是一种相当聪明的方法。
1
nil
Maybe
let i: Int = nil
这里发生了什么,不过,是字面1是几种类型的有效值:Int,Int32,Int64,UInt32,UInt64,等,等,等,而且这 也是 这些类型的可选版本的有效值:Int?,Int32?,等。
Int
Int32
Int64
UInt32
UInt64
Int32?
因此,当Swift编译器看到文字值和之间的比较时nil,它会尝试找到两个值都适用的类型。1是Int?类型的有效值,也是类型nil的有效值Int?,因此它将比较运算符与类型签名一起应用(Int?, Int?) -> Bool。(这是比较运算符,它接受两个Int?值并返回Bool)。该运算符的规则表明,nil值的排序比其他任何值都低,即使是Int.min,因此您可以在OP的问题中看到结果。
(Int?, Int?) -> Bool
Bool
Int.min