【问题标题】:Does anybody know the rationale behind "(nil < 0) == true" and "(nil <= 0) == true" in Swift?有人知道 Swift 中“(nil < 0) == true”和“(nil <= 0) == true”背后的基本原理吗?
【发布时间】:2015-07-16 17:04:10
【问题描述】:

我认为 Swift 是一种构建良好的现代语言,但是,有一件事让我感到困惑,那就是具有 (nil 和 (nil

这里有更多案例:

无论如何,为 nil

任何人都有任何解释 Swift 决定让 (nil

【问题讨论】:

  • 我不认为这与 0 有任何关系。输入任意数字, (nil

标签: swift null swift2


【解决方案1】:

Optional 具有可比性,因此例如可以对其进行排序。规则很简单:

  1. 任何两个为 nil 的选项比较相等。
  2. 如果其中一个选项是 nil 而另一个不是,则 nil 小于非 nil。
  3. 如果两个选项都不为零,则比较展开的值。

因此,nil 等于 nil,并且 nil 小于任何非 nil 可选值。

它与您分配的值 0 无关。分配 -1000 或 +100 或任何你喜欢的,你会得到相同的结果。

【讨论】:

  • 非常聪明,这就是原因。我很生气自己没有想到这一点。
  • 您可以使用带有可选链接的 nil 合并运算符来绕过它,并且仍然可以享受漂亮的 swifty 速记,例如let isZoomed = (view as? MetalView)?.cameraPosition.z ?? 0.0 &lt; 0.0。接近可读性的极限。
  • nil == nil 在 Playgrounds 和 .swift 程序中生成语法错误。这是 Xcode 7.3.1。
  • 我在查看instance?.value &gt; 0instance?.value &lt; 0 等条件表达式时遇到了这个问题。如果 instance 为 nil,则 (instance?.value &lt; 0) == true(instance?.value &gt; 0) == false(instance?.value == 0) == false 在我看来真的很奇怪。
  • 有没有人提到苹果在哪里声明了“Optionals are compatible”?我正在寻找指向一些库代码或文档的指针,他们说可选类型都遵守 Comparable 协议。
【解决方案2】:

当比较两个可选值时,一个为 nil,另一个为某个值,该值总是“更大”,因为什么都没有。

所以

nil < 0 = true     Because 0 is some value but nil isn't
nil == 0 = false    Makes sense because 0 isn't nil
nil <= 0 = true    Same as before

0 也可以替换为任何值,并且会产生相同的结果。其实功能

func < <T>(lhs: T?, rhs: T?) -> Bool

如果其中一个为 nil,甚至不查看基础价值,它只是说:Some value is greater than no value 并且 No value 等于 no value强>

【讨论】:

  • 是的,你是对的。应该看看代码。
猜你喜欢
  • 2012-03-23
  • 2016-04-08
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2013-11-21
相关资源
最近更新 更多