var a = 7
a != nil //Error: value of type 'Int' can never be nil, comparison isn't allowed
7 != nil //--> false
0 > nil //true
-9999999 > nil //true
问题非常像上面的代码,好的我从编译器得到它无法将a
与nil
进行比较,但为什么是文字7
可以与零比较。我的意思是7
是创建的现有数字,它也永远不会是nil
,不是吗?
顺便说一句
当我尝试同时返回-9999999 > nil
的{{1}}时,我终于开始以正确的方式了解true
。 10分钟前我仍然认为nil
会返回-1 < nil
。如果你能告诉我更多关于true
的信息,那将会很好。它是什么?它不是指针(与Object-C不同)。只是简单地注意到了吗?
答案 0 :(得分:2)
这来自标准库
/// A type that can represent either a `Wrapped` value or `nil`, the absence
/// of a value.
public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
case None
case Some(Wrapped)
需要注意的是,Optional可以是nil literal convertible。
其次,这是在Swift库中定义比较的方法,可以在此链接的github上看到:Github Swift Optional Implementation Code
public func < <T : Comparable> (lhs: T?, rhs: T?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l < r
case (nil, _?):
return true
default:
return false
}
}
public func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l > r
default:
return rhs < lhs
}
}
组合时可以用来推理你的代码。
策略如下:
0 > nil
return true
return true
简化第2步和第3步: nil始终小于.some
&gt; /&lt;的比较当任何一方为零时,不考虑元素类型。
在
的情况下 var a = 7
a != nil
很明显,Int无法与Optional.None进行比较,这正是编译器大喊大叫的内容。
希望这能解释它。