还有另一种方法可以在swift中处理Range运算符中的异常吗?

时间:2016-04-15 05:26:01

标签: swift

我非常喜欢迅速,请耐心等待我:)

如果,在以下代码中

for i in (1...(self.count - 1)) { //(self.count is number of elements in Array Extension)
    print(i)
}

self.count变为1.

嗯..我可以像以下一样工作

if self.count > 1
{
    for i in (1...(self.count - 1)) {
        print(i)
    }
}
else
{
    for i in ((self.count - 1)...1) {
        print(i)
    }
}

但还有另一种(可能更好)的方式来解决这个问题吗?

其中我不必使用if-else控制语句

PS: - 正如评论中所建议的那样,我也使用了

for i in [(1...(self.count - 1))]
{
    print(i)        
}

但是当self.count = 1

时它仍会崩溃

2 个答案:

答案 0 :(得分:0)

处理范围异常的最佳方法是不引起它们 首先;)

为什么不使用基于零的索引,然后在需要时稍后在循环中调整它?

extension Array {
    func oneBasedIndices() -> [Int] {
        return (0..<count).map { return $0 + 1 }
    }
}

Array count成员的最小数量可能是0,而0..<0永远不会失败,所以也许这样的扩展可以做到如果您想要的是基于1的索引。

答案 1 :(得分:0)

要迭代所有数组索引,请使用..<范围运算符 省略上限:

for i in 0 ..< array.count { }

或更好:

for i in array.indices { }

后者的优势在于它也适用于收藏品 不是从零开始的索引(例如ArraySlice)。

迭代所有索引,但第一个,

for i in array.indices.dropFirst() { }

适用于所有情况,即使数组为空。你也应该检查一下 如果你真的需要索引,或者你真的想要迭代 在数组元素上,例如

for elem in array.dropFirst() { }