在 Swift 3 中,这是一个编译错误,如果我使用>或<
let a: Int?
guard a > 0 else {return}
guard a < 0 else {return}
Run Code Online (Sandbox Code Playgroud)
编译错误:
可选类型“Int?”的值 未解开;你的意思是使用“!” 或者 '?'?
但如果我比较==或!=
let a: Int?
guard a == 0 else {return}
guard a != 0 else {return}
Run Code Online (Sandbox Code Playgroud)
相等运算符支持可选项是完全合理的,因为对于任何整数值变量来说,这是绝对清楚的i:
nil == nilnil != ii != nili == i 当且仅当它们的值相同另一方面,尚不清楚比较nil应该如何起作用:
是i不到nil?
nils 都在最后出现,那么我希望i小于nil.nils 都在开始时出现,那么我希望i大于nil.由于其中任何一个都同样有效,标准库偏爱一个而不是另一个是没有意义的。由程序员来实现对他们的用例有意义的任何比较。
这是一个玩具实现,它生成一个比较运算符来适应任何一种情况:
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.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))))
Run Code Online (Sandbox Code Playgroud)
输出:
输入:
[0?, nil, 2?, nil, 4?, nil, 6?, nil, 8?, nil, 10?]零是更少:
[nil, nil, nil, nil, nil, 0?, 2?, 4?, 6?, 8?, 10?]零更多:
[0?, 2?, 4?, 6?, 8?, 10?, nil, nil, nil, nil, nil]
| 归档时间: |
|
| 查看次数: |
2404 次 |
| 最近记录: |