普通的类型变量不能与nil比较,但是文字可以,为什么呢?

时间:2016-06-15 17:59:52

标签: swift null compare

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

问题非常像上面的代码,好的我从编译器得到它无法将anil进行比较,但为什么是文字7可以与零比较。我的意思是7是创建的现有数字,它也永远不会是nil,不是吗?

顺便说一句 当我尝试同时返回-9999999 > nil的{​​{1}}时,我终于开始以正确的方式了解true。 10分钟前我仍然认为nil会返回-1 < nil。如果你能告诉我更多关于true的信息,那将会很好。它是什么?它不是指针(与Object-C不同)。只是简单地注意到了吗?

1 个答案:

答案 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
  1. 0被暗示推断为Optional或Int?。
  2. Swift Optinal有&lt; ,表示如果 lhs为零return true
  3. Swift Optional有&gt; ,表示如果 rhs为零,那么return true
  4. 简化第2步和第3步: nil始终小于.some

    &gt; /&lt;的比较当任何一方为零时,不考虑元素类型。

    的情况下
      var a = 7
      a != nil
    

    很明显,Int无法与Optional.None进行比较,这正是编译器大喊大叫的内容。

    希望这能解释它。