当前位置: 首页 > 面试题库 >

当相等运算符可以时,为什么Swift的大于或小于运算符不能比较可选项?

潘灵均
2023-03-14
问题内容

在Swift 3中,如果我使用>或,这是一个编译错误<

let a: Int?
guard a > 0 else {return}
guard a < 0 else {return}

编译错误:

可选类型’Int?’的值 没有包装; 你是说用’!’ 要么 ‘?’?

但如果我与==或比较!=

let a: Int?
guard a == 0 else {return}
guard a != 0 else {return}

问题答案:

对于相等运算符来说,支持可选值是很有意义的,因为对于任何整数值变量,这是绝对清楚的i

  • nil == nil
  • nil != i
  • i != nil
  • i == i 当且仅当它们的值相同时

另一方面,尚不清楚与的比较nil应如何起作用:

i小于nil

  • 如果我想对数组进行排序以使所有nils都在末尾出现,那么我希望i小于nil
  • 但是,如果我想对数组排序以便所有nils都在开始时出现,那么我希望i大于nil

由于这两种方法都同样有效,因此标准库偏one其中一个是没有意义的。留给程序员实施对于他们的用例有意义的比较。

这是一个玩具实现,可以生成一个比较运算符来适应两种情况:

func nilComparator<T: Comparable>(nilIsLess: Bool) -> (T?, T?) -> Bool {
    return {
        switch ($0, $1) {
            case (nil, nil): return true
            case (nil, _?): return nilIsLess
            case (_?, nil): return !nilIsLess
            case let (a?, b?): return a < b
        }
    }
}

let input = (0...10).enumerated().map {
    $0.offset % 2 == 0 ? Optional($0.element) : nil
}

func concisePrint<T>(_ optionals: [T?]) -> String {
    return "[" + optionals.map { $0.map{ "\($0)?" } ?? "nil" }.joined(separator: ", ") + "]"
}

print("Input:", concisePrint(input))
print("nil is less:", concisePrint(input.sorted(by: nilComparator(nilIsLess: true))))
print("nil is more:", concisePrint(input.sorted(by: nilComparator(nilIsLess: false))))

输出:

输入:[0?,nil,2?,nil,4?,nil,6?,nil,8?,nil,10?]

nil小于:[nil,nil,nil,nil,nil,0?,2?,4?,6?,8?,10?]

nil更大:[0?,2?,4?,6?,8?,10?,nil,nil,nil,nil,nil]



 类似资料:
  • 问题内容: Swift 1.1包含〜>运算符的声明: 这在Swift中有什么用?它似乎已声明,但未定义任何可利用它的函数。其他开发人员已将其用于响应模式和封送队列之间的封包,但我想知道为什么在标准框架中对其进行了定义。我猜想它可以“保留”一个自定义运算符供开发人员使用,因为它具有最高的优先级。 问题答案: 由于Swift是开源的,我们可以看到将stdlib 包括在内的实际原因:作为Swift 1.

  • 虽然JavaScript的类型严格比较运算符(,)很好,但它没有相应的大于/小于的严格比较。 为什么不呢?我问这个问题完全是希望答案是“嗯,因为它没有”,但我还是在问,以防遗漏这些运营商有一个有趣和/或令人沮丧的历史原因。

  • 问题内容: 我注意到我可以使用运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该运算符等效于该运算符) 我的问题是:什么时候操作员不只是比较身份? 编辑:我正在使用Python 3

  • 问题内容: 我注意到最近有一段代码直接比较两个整数列表,如下所示: 这似乎有点奇怪,但我想如果所有元素都大于,它将返回,如果每个元素相等或元素大于则返回False 。所以我测试了它: 好的,行得通。和: 但是当它变得更加模糊时: 要么: 结果有点陌生。python实际在做什么?看来它返回的结果偏向于第一个列表,其中最左边的元素大于相应的元素? 问题答案: 从比较序列和其它类型在Python教程:

  • 问题内容: 有人可以解释一下SQL中的以下行为吗? 问题答案: 是标准SQL-92;是等效的。两者都评估值,但不是-是占位符,表示不存在值。 这就是为什么您只能在此类情况下使用/作为谓词的原因。 此行为不特定于SQL Server。所有符合标准的SQL方言都以相同的方式工作。 注意 :要比较如果您的 值不为null ,请使用,而要与 不为null 值进行比较,请使用。我不能说我的值是否等于NULL

  • 问题内容: 我来自ac风格语言,因此我很自然地使用不相等的语言,但是当我使用Python时,从我阅读的文档中我了解到为此目的使用了运算符。 最近,我看到了很多使用的代码,所以我的问题是,其中之一比其他的更受青睐,还是其中之一被弃用了。 另外,我想知道它们之间是否有任何区别。 问题答案: 蟒2只支持 两个 ,在Python 3的操作者已被删除。 两者之间没有区别,但是是首选形式。