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

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

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

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


当前回答

斯威夫特4.0

for i in stride(from: 5, to: 0, by: -1) {
    print(i) // 5,4,3,2,1
}

如果你想包含to值:

for i in stride(from: 5, through: 0, by: -1) {
    print(i) // 5,4,3,2,1,0
}

其他回答

对我来说,这是最好的办法。

var arrayOfNums = [1,4,5,68,9,10]

for i in 0..<arrayOfNums.count {
    print(arrayOfNums[arrayOfNums.count - i - 1])
}

反转一个数组只需要一个步骤。reverse()

var arrOfnum = [1,2,3,4,5,6]
arrOfnum.reverse()

Xcode 6 beta 4增加了两个函数来迭代除一个步骤以外的范围: Stride (from: to: by:)用于独占范围,Stride (from: through: by:)用于包含范围。

要以相反的顺序迭代一个范围,它们可以如下所示:

for index in stride(from: 5, to: 1, by: -1) {
    print(index)
}
//prints 5, 4, 3, 2

for index in stride(from: 5, through: 1, by: -1) {
    print(index)
}
//prints 5, 4, 3, 2, 1

注意,这两个都不是Range成员函数。它们是返回StrideTo或StrideThrough结构体的全局函数,它们与Range结构体的定义不同。

这个答案的前一个版本使用了Range结构体的by()成员函数,该函数在beta 4中被删除。如果您想了解它是如何工作的,请检查编辑历史记录。

对范围应用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
}
var sum1 = 0
for i in 0...100{
    sum1 += i
}
print (sum1)

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