Swift nil有一个数值吗?
这是Swift中的有效代码:Swift nil有一个数值吗?,swift,optional,Swift,Optional,这是Swift中的有效代码: println(nil < 1) 将为false(数字1是任意的,您可以对-1执行相同的操作,可能还有其他操作)。我问这个问题的原因是因为我看到一些代码试图将“some_string”.toInt()与数值进行比较,然后进行编译,考虑到toInt()返回Int?,这似乎是错误的 我的问题是,这是否应该是Swift中的有效语法?如果是,nil的数值是多少? Swift 3.0更新: 看来快速进化解决了这个问题。这在Swift 3.0中不再是一个问题,因为它没
println(nil < 1)
将为false(数字1是任意的,您可以对-1执行相同的操作,可能还有其他操作)。我问这个问题的原因是因为我看到一些代码试图将“some_string”.toInt()
与数值进行比较,然后进行编译,考虑到toInt()
返回Int?
,这似乎是错误的
我的问题是,这是否应该是Swift中的有效语法?如果是,nil的数值是多少?
Swift 3.0更新:
看来快速进化解决了这个问题。这在Swift 3.0中不再是一个问题,因为它没有编译。我相信发生的是,通过与
nil
进行比较,文本1
被隐式类型转换为Int?
类型。对于那些不习惯Swift的人,我将进一步解释。Swift有一个称为“optionals”的概念,它可以有一个值,也可以是nil
。(对于熟悉Haskell的人来说,这基本上是可能单子。)将nil
赋值给未明确定义为可选的变量是非法的,因此编译器将拒绝let i:Int=nil
。这将带来一些超出本答案范围的好处,这是一种相当聪明的方法
然而,这里发生的事情是,文本1
是几种类型的有效值:Int
,Int32
,Int64
,UInt32
,UInt64
,UInt64
,UInt64
,UInt64
,等等。它也是这些类型的可选版本的有效值:Int
,等等
因此,当Swift编译器看到一个文本值和nil
之间的比较时,它会试图找到一个两个值都有效的类型1
是Int?
类型的有效值,nil
也是Int?
类型的有效值,因此它将使用类型签名(Int?、Int?->Bool>应用比较运算符。(这是一个比较运算符,它接受两个Int?
值并返回一个Bool
)。该运算符的规则说,nil
值排序比任何其他值都低,甚至Int.min
,因此您可以在OP的问题中看到结果。这在我看来像个bug。Int.min为Int?>nil
$R14:Bool=true
可能是为了让您比较两个Int?
和Int.min>nil
给出编译error@BryanChen这当然很有趣。在这种情况下,我肯定会说一个bug,但我真的很想知道它是如何得出这个结论的;println(nil
,也不允许i:Int=1;println(nil
。如果println(nil<1)
中的1
被直接提升为Int?
,我想这是有道理的,但这似乎仍然很奇怪……我看到越来越多的人支持这样一种理论,即文本1
是Int?
类型的有效值,所以Swift自动将其类型转换为一种可以在比较操作中使用的有效类型Int
与nil
比较无效,但Int?
有效。我将继续回答这个问题,这样人们就可以确认(通过对答案进行投票)这是否真的发生了。顺便说一句,在Haskell(据我所知)中这是不可能的,因为Maybe
monad被定义为有两个可能的值:要么Nothing
要么Just x
(其中x
可以是任何类型)由于x
永远不能被隐式提升为仅x
,Haskell编译器将在给定比较运算符的情况下,禁止1
和Nothing
之间进行任何比较,因为前者是Int
类型,并且没有o用于比较Int
和可能是Int
的运算符(但只比较1
和没有任何内容是有效的:两者都属于可能是Int
类型).更正我之前评论中的插入语:没有任何东西有价值可能是x
,其中x
可以是任何类型。但这与类型可能是Int
匹配,因此比较是有效的。的一个签名非常有意义,因为Swift编译器试图推断类型。这Swift 3:“可选比较运算符”已被删除,print(1
不再编译。
println(nil > 1)