Swift nil有一个数值吗?

Luc*_*ugh 23 optional swift

这是Swift中的有效代码:

println(nil < 1)
Run Code Online (Sandbox Code Playgroud)

同样,输出也是如此

println(nil > 1)
Run Code Online (Sandbox Code Playgroud)

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

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


Swift 3.0更新:

看起来Swift Evolution通过删除可选的比较运算符解决了这个问题.这不再是Swift 3.0中的一个问题,因为它不能编译.

rmu*_*unn 17

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

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

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

  • ```运算符的一个签名是:`func << T:_Comparable>(lhs:T?,rhs:T?) - > Bool`; 我相信这就是它的来源.编写快速测试函数:`func test <T:Comparable>(lhs:T?,rhs:T?)`并调用`test(nil,1)`有效.在该函数内部调用`println(_stdlib_getDemangledTypeName(rhs))`打印`Swift.Optional`; 调用`println(_stdlib_getDemangledTypeName(rhs!))`打印`Swift.Int`.因此,在调用中作为`1`传递的`rhs`是一个`Int?`. (7认同)
  • 这个"可选比较运算符"已在Swift 3中删除:https://github.com/apple/swift-evolution/blob/master/proposals/0121-remove-optional-comparison-operators.md和`print(1 <nil)`不再编译. (4认同)