Swift 中的 nil 或 "empty" 可数范围是多少?

What is the nil or "empty" countable range in Swift?

在Swift3,

let highestIndex = 7
for index in 1 ..< highestIndex {
    latter(index)
}

然而,

let highestIndex = 0, or anything smaller
for index in 1 ..< highestIndex {
    latter(index)
}

崩溃了。

因此,..< 运算符在大多数情况下是不切实际的。

所以,也许,像这样...

for index in (1 ..< highestIndex).safely() {
    latter(index)
}

如何编写扩展名 safely

或者在最坏的情况下只是一个函数 safely(from,to),其中 returns 一个 CountableRange,或者一个“空”(?) 可数范围? (我不明白 Swift 扩展是否可以“捕获”错误?)

我可以让它正常工作:

for index in 1 ..< 1 {
    latter(index)
}

对于<1的情况,我推荐如下:

guard highestIndex > 0 else { return }

for index in 1 ..< highestIndex {
    latter(index)
}

尽可能贴近 ..< 运算符,以下是 safely.

的适当实现
public func safely<Bound>(_ minimum: Bound, _ maximum: Bound) -> CountableRange<Bound> where Bound : _Strideable & Comparable, Bound.Stride : Integer {
    if maximum < minimum {
        return CountableRange(uncheckedBounds: (lower: minimum, upper: minimum))
    }
    return CountableRange(uncheckedBounds: (lower: minimum, upper: maximum))
}

let one = safely(0, 12)  // CountableRange(0..<12)
let two = safely(15, 12) // CountableRange(15..<15)

one.isEmpty // false
two.isEmpty // true

您可能需要考虑为参数提供更好的名称以指示它们是否包含/不包含边界等。

创建扩展并添加 .safely() 将不起作用,因为在创建 CountableRange 时会在调用 safely 之前检查边界。

我喜欢简单的解决方案:

let lowerIndex = 1
let higherIndex = 0
for index in lowerIndex ..< max(lowerIndex, higherIndex) {
    latter(index)
}