Swift中的nil或“空”可数范围是多少?

时间:2017-02-05 22:35:54

标签: swift3 iteration control-flow

在Swift3中,

1 * y * y

然而,

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

崩溃。

所以,...&lt;在大多数情况下,运算符是不切实际的。

所以,或许,这样的事情......

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

如何编写扩展名for index in (1 ..< highestIndex).safely() { latter(index) }

或者最坏的情况是只返回一个函数safely,它返回一个CountableRange,或者一个“空”(?)可数范围? (我不明白Swift扩展是否可以,“捕获”错误?)

3 个答案:

答案 0 :(得分:1)

我能够让这个工作得很好:

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

对于<1案例,我建议这样的事情:

guard highestIndex > 0 else { return }

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

答案 1 :(得分:1)

尽可能贴近..<运算符,以下是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时会检查边界。

答案 2 :(得分:1)

我是简单解决方案的粉丝:

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