使Optional.none的值为0



与nil/NULL不同的可选值默认情况下不能与数值进行比较。必须采取哪些步骤才能使nil < 1nil < 1.0评估为true?

nil == 0永远不会计算为true,因为它是false。类似地,1 == 0不会计算为true,并且没有合理的步骤可以使其计算为true。对于==,不相等的事情不应该返回true。

您想要的语法是(nil ?? 0) == 0,这是正确的。

但是,如果你发现自己经常试图将nil视为0(通常情况下,你会想要一些特殊的处理),那么这表明你的类型是不正确的。为什么这个变量是可选的?听起来这个变量应该只是一个Int。如果它以可选(最常见的是通过JSON)的形式进入您的系统,您应该尽早将其转换为非可选类型,并在系统的其余部分使用它。Swift中的绝大多数变量和属性都不应该是可选的。如果他们是(很多人都犯了这个错误),你会发现自己一直在与这个系统作斗争。


对于您的编辑,Swift曾经允许您以这种方式使用带有nil的<。它是故意删除的(SE-0121),因为它会导致太多非常微妙的错误(就像将NULL隐式处理为0长期以来一直导致C和ObjC中的错误一样)。你绝对不应该试图把它放回去。这是一个非常糟糕的语义。

我不确定我是否建议这样做,但你可以这样做,作为整数的一个例子,首先检查它是否为零,如果是,只与0进行比较。对于翻转的参数,您必须重复此操作,对于其他类型,也必须重复相同的操作。

extension Optional where Wrapped == Comparable {
public static func < (lhs: Wrapped?, rhs: Int) -> Bool {
guard let left = lhs as? Int else {
return 0 < rhs
}
return left < rhs
}
}

相关内容

  • 没有找到相关文章

最新更新