这是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
我相信正在发生的事情是,字面意思1是Int?通过比较来隐式地对类型进行类型转换nil.对于那些不习惯Swift的人,我会进一步解释一下.Swift有一个名为"optionals"的概念,它既可以有价值,也可以有nil.(对于熟悉Haskell的人来说,这基本上就是Maybemonad.)分配nil给未明确定义为可选的变量是非法的,因此let i: Int = nil将被编译器拒绝.这允许多种好处超出了本答案的范围,而且这是一种相当聪明的方法.
这里发生了什么,不过,是字面1是几种类型的有效值:Int,Int32,Int64,UInt32,UInt64,等,等,等,而且这也是这些类型的可选版本的有效值:Int?,Int32?,等.
因此,当Swift编译器看到文字值之间的比较时nil,它会尝试查找这两个值都有效的类型.1是Int?类型的有效值,也是类型nil的有效值Int?,因此它将比较运算符应用于类型签名(Int?, Int?) -> Bool.(这是比较运算符,它接受两个Int?值并返回a Bool).该运算符的规则表明,nil值排序低于其他任何值,甚至Int.min,因此您可以在OP的问题中看到结果.
| 归档时间: |
|
| 查看次数: |
4279 次 |
| 最近记录: |