当我在Playground中使用for循环时,一切都很好,直到我将for循环的第一个参数更改为最大值。(按降序迭代)

这是一个bug吗?还有其他人有吗?

for index in 510..509
{
    var a = 10
}

显示将要执行的迭代次数的计数器一直在滴答作响……


当前回答

您可以使用reversed()方法轻松反转值。

var i:Int
for i in 1..10.reversed() {
    print(i)
}

reversed()方法反转值。

其他回答

在Swift 4及后续版本中

    let count = 50//For example
    for i in (1...count).reversed() {
        print(i)
    }
var sum1 = 0
for i in 0...100{
    sum1 += i
}
print (sum1)

for i in (10...100).reverse(){
    sum1 /= i
}
print(sum1)

对于Swift 2.0及以上版本,你应该在range collection上应用reverse

for i in (0 ..< 10).reverse() {
  // process
}

在Swift 3.0中已被重命名为.reversed()

对范围应用reverse函数进行反向迭代:

对于Swift 1.2及更早版本:

// Print 10 through 1
for i in reverse(1...10) {
    println(i)
}

它也适用于半开放范围:

// Print 9 through 1
for i in reverse(1..<10) {
    println(i)
}

注意:reverse(1…10)创建了一个类型为[Int]的数组,所以虽然这可能适用于较小的范围,但明智的做法是如下所示使用lazy,或者如果您的范围很大,则考虑接受的stride答案。


为了避免创建大数组,请使用lazy和reverse()。下面的测试在Playground中高效运行,显示它没有创建一个包含一万亿int的数组!

测试:

var count = 0
for i in lazy(1...1_000_000_000_000).reverse() {
    if ++count > 5 {
        break
    }
    println(i)
}

对于Xcode 7中的Swift 2.0:

for i in (1...10).reverse() {
    print(i)
}

注意,在Swift 2.0中,(1…1_000_000_000_000).reverse()的类型是ReverseRandomAccessCollection<(Range<Int>)>,所以这工作正常:

var count = 0
for i in (1...1_000_000_000_000).reverse() {
    count += 1
    if count > 5 {
        break
    }
    print(i)
}

对于Swift 3.0, reverse()已重命名为reversed():

for i in (1...10).reversed() {
    print(i) // prints 10 through 1
}

如果希望反向遍历数组(array或更一般的任何SequenceType)。您还有一些额外的选项。

首先,您可以reverse()数组并像往常一样遍历它。但是我更喜欢使用enumerate(),因为它输出一个包含对象和它的索引的元组。

这里需要注意的一件事是,以正确的顺序调用它们是很重要的:

For (index, element) in array.enumerate().reverse()

按降序生成索引(这是我通常期望的)。而:

for (index, element) in array.reverse().enumerate()(与NSArray的reverseEnumerator更接近)

反向遍历数组,但输出升序索引。