Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift nil有一个数值吗?_Swift_Optional - Fatal编程技术网

Swift nil有一个数值吗?

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中不再是一个问题,因为它没

这是Swift中的有效代码:

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)