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

2023-12-15

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

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

编译错误:

可选类型“Int?”的值未拆封;你的意思是使用“!”吗?或者 '?'?


但如果我比较一下就没关系了== or !=

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

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

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

另一方面,尚不清楚如何比较nil应该采取行动:

Is i少于nil?

  • 如果我想对一个数组进行排序,以便所有的nil最后出来,然后我想要i小于nil.
  • 但如果我想对一个数组进行排序,以便所有nil一开始就出来了,然后我想要i大于nil.

由于其中任何一个都同样有效,因此标准库偏爱其中一个是没有意义的。程序员可以根据自己的用例来实现任何有意义的比较。

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

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

let input = (0...10).enumerated().map {
    $0.offset.isMultiple(of: 2) ? 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))))

Output:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐