设为Optional.none评估为0

时间:2019-02-11 14:43:59

标签: swift null optional

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

2 个答案:

答案 0 :(得分:1)

nil == 0将永远不会为true,因为它为false。同样,1 == 0的评估结果不会为true,也没有采取任何合理的步骤。对于==,不平等的事物不应返回true。

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

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


为了进行编辑,Swift曾经允许您通过这种方式将<与nil一起使用。它之所以被删除(SE-0121)是因为它会导致许多非常细微的错误(就像隐式将NULL视为零一样,长期以来一直在C和ObjC中引起错误)。您绝对不应该尝试将其放回原处。这确实是一个糟糕的语义。

答案 1 :(得分:1)

我不确定我会建议这样做,但是您可以做类似的事情,例如,整数首先检查它是否为nil,如果是,则与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
    }
}