一尘不染

Swift nil是否有数值?

swift

这是Swift中的有效代码:

println(nil < 1)

同样,输出将为真

println(nil > 1)

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

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


Swift 3.0更新:

看起来Swift Evolution通过删除可选的比较运算符解决了这个问题。在Swift 3.0中,由于它无法编译,因此不再是一个问题。


阅读 163

收藏
2020-07-07

共1个答案

一尘不染

我相信正在发生的事情是,通过与比较,1隐式地将文字转换为该Int?类型nil。对于那些不习惯Swift的人,我将进一步解释。Swift有一个称为“可选”的概念,可以有一个值或为nil。(对于熟悉Haskell的人来说,这基本上是Maybemonad。)将nil变量赋给未明确定义为可选的变量是非法的,因此let i: Int = nil将被编译器拒绝。这带来了一些超出此答案范围的好处,这是一种相当聪明的方法。

这里发生了什么,不过,是字面1是几种类型的有效值:IntInt32Int64UInt32UInt64,等,等,等,而且这
也是 这些类型的可选版本的有效值:Int?Int32?,等。

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

2020-07-07