首页 文章

Swift nil有一个数值吗?

提问于
浏览
23

这是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 回答

  • 17

    我相信正在发生的事情是,通过与 nil 的比较,文字 1 被隐式地类型化为 Int? 类型 . 对于那些没有进一步解释的人来说 . Swift有一个名为"optionals"的概念,它可以有一个值或者是 nil . (对于熟悉Haskell的人来说,这基本上就是 Maybe monad . )将 nil 分配给未明确定义为可选的变量是非法的,因此编译器将拒绝 let i: Int = nil . 这允许多种好处超出了本答案的范围,而且这是一种相当聪明的方法 .

    但是,这里发生的是文字 1 是几种类型的有效值: IntInt32Int64UInt32UInt64 等等 . 它也是这些类型的可选版本的有效值 . : Int?Int32?

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

相关问题