相等运算符支持选项是非常有意义的,因为对于任何整数值变量来说这是绝对清楚的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]